繁体   English   中英

无法创建变量类型“Item”的实例,因为它没有 new() 约束

[英]Cannot create an instance of the variable type 'Item' because it does not have the new() constraint

我正在尝试测试一种方法 - 并收到错误消息:

无法创建变量类型“Item”的实例,因为它没有 new() 约束

以下所需资料:

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.aspxhttp://msdn.microsoft.com/en-来了解此错误的含义或解决方法us/library/x3y47hd4.aspx - 但它没有帮助。

我不明白这个错误 - 我已经将“SomeClass”限制为类型。 我无法约束整个 Test 类(由 Visual Studio 生成的单元测试类,其中包含所有测试) - 否则我会收到许多其他错误。 Item 类没有任何模板...

除非使用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);

因为很多人是通过问题tilte(这是非常通用的并且与编译器消息匹配)到达这里的,所以让我就编译错误itsef 给出更详细的答案。

您在方法中使用泛型。 编译器不知道它将接收哪种类型,因此不能保证您的类型具有无参数构造函数。 例如:

class A {
    A(int i){ ... }
}

class B { ... }

public void MyMethod<T>(){
    T t = new T(); //This would be fine if you use 'MyMethod<B>' but you would have a problem calling 'MyMethod<A>' (because A doesn´t have a parameterless construtor;
}

要解决此问题,您可以告诉编译器您的泛型参数具有无参数构造函数。 这是通过定义约束来完成的:

public void MyMethod<T>()  where T: new(){
    T t = new T(); //Now it's ok because compiler will ensure that you only call generic method using a type with parameterless construtor;
}

可以在此处找到有关构造函数约束的更多信息: https : //msdn.microsoft.com/en-us/library/bb384067.aspx

该行中的Item

Item i = new Item(p, 10);

指的是CountTestHelper方法的泛型类型参数Item ,而不是Item类。 更改通用参数名称,例如

public void CountTestHelper<TItem>() where TItem : IHasRect
{
    Rectangle rectangle = new Rectangle(0, 0, 100, 100); 
    SomeClass<TItem> target = new SomeClass<TItem>(rectangle);            
    Point p = new Point(10,10);
    Item i = new Item(p, 10);    
    ...
}

或者,您可以完全限定要创建的Item类的名称:

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);
    SomeNamespace.Item i = new SomeNamespace.Item(p, 10);  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM