C#中的继承,where T: new()是什么意思?

4

可能是重复问题:
new()是什么意思?

就像标题所示。我想知道代码中这个语法的含义。我在一些示例中找到了它,但没有解释,我真的不知道它是做什么的。

public class SomeClass<T> where T: new()  // what does it mean?

有人能为我解释一下吗?
3个回答

9
也许您是指类似这样的东西?
public class SomeClass<T> where T: new() 
{...}

这意味着您只能使用具有公共无参数构造函数的类型T与通用类一起使用。这些被称为通用类型约束。也就是说,您不能执行以下操作(请参见CS0310):

// causes CS0310 because XmlWriter cannot be instantiated with paraless ctor
var someClass = new SomeClass<XmlWriter>();

// causes same compile error for same reason
var someClass = new SomeClass<string>();

为什么需要这样的限制?假设您想实例化类型T的新变量。只有在具有此约束时才能这样做,否则编译器事先无法知道实例化是否有效。例如:

public class SomeClass<T> where T: new() 
{
    public static T CreateNewT()
    {
         // you can only write "new T()" when you also have "where T: new()"
         return new T();
    }
}

1
那就是答案 :) 非常感谢 :) 现在一切清楚 :) - Harry89pl
new SomeClass<string>() 会导致错误(它不会“抛出”),因为 string 没有无参构造函数。 - svick
@svick:这正是我所想的,我会删除“throws”。CS0310是编译时错误。原因已经在我的文本中了,我以为。 - Abel
@Abel,我以为这让你感到困惑,因为我读到“也会抛出某些原因”。现在我注意到那不是你写的,我的错。 - svick

3

这是一个泛型类型约束,意味着泛型类型必须具有公共的无参数构造函数。

你的代码示例甚至都无法编译。

正确的语法应该是:

SomeClass<T> where T : new()

1

你没有发布完整的代码行,因为它无法编译,但这是泛型中的一个限制。这里是MSDN文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接