変数タイプ 'Item' のインスタンスを作成できません。new() 制約がないため質問する

変数タイプ 'Item' のインスタンスを作成できません。new() 制約がないため質問する

メソッドをテストしようとしていますが、エラーが発生します:

new() 制約がないため、変数タイプ 'Item' のインスタンスを作成できません。

必要な情報は以下の通りです:

public interface IHasRect
{
    Rectangle Rectangle { get; }
}

ヘルパークラス:

class Item : IHasRect
{
    public Item(Point p, int size)
    {
        m_size = size;
        m_rectangle = new Rectangle(p.X, p.Y, m_size, m_size); 
    }
}

関数をテストするには、オブジェクトをインスタンス化する必要があります...

public class SomeClass<T> where T : IHasRect

テスト:

public void CountTestHelper<Item>() where Item : IHasRect
{
    Rectangle rectangle = new Rectangle(0, 0, 100, 100); 
    SomeClass<Item> target = new SomeClass<Item>(rectangle);            
    Point p = new Point(10,10);
    Item i = new Item(p, 10);      // error here        
    ...
}
[TestMethod()]
public void CountTest()
{
    CountTestHelper<Item>();
}   

このエラーの意味や修正方法を理解しようとしています。http://msdn.microsoft.com/en-us/library/d5x73970.aspxそしてhttp://msdn.microsoft.com/en-us/library/x3y47hd4.aspx- しかし、それは役に立ちません。

このエラーの意味がわかりません。すでに「SomeClass」を 型に制限しています。Test クラス全体 (Visual Studio によって生成された、すべてのテストを含む単体テスト クラス) を制限することはできません。そうしないと、他のエラーが多数発生します。Item クラスにはテンプレートがありません...

ベストアンサー1

newキーワードを使用してデフォルト コンストラクターを実装するようにマークしない限り、ジェネリック型オブジェクトを初期化することはできません。

public void CountTestHelper<Item>() where Item : IHasRect, new()
 {
    Rectangle rectangle = new Rectangle(0, 0, 100, 100); 
    SomeClass<Item> target = new SomeClass<Item>(rectangle);            
    Point p = new Point(10,10);
    Item i = new Item();    // constructor has to be parameterless!
    ...
 }

一方、Itemアプリケーション内の別の場所で定義された型オブジェクトを初期化しようとしている場合は、その前に名前空間を使用してみてください。

MyAppNamespace.Item i = new MyAppNamespace.Item(p, 10);

おすすめ記事