我正在写一个Generic类,如下所示.
public class Foo<T> :
where T : Bar, new()
{
public void MethodInFoo()
{
T _t = new T();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,_tT类型的对象在运行时被实例化.为了支持泛型类型T的实例化,语言强制我将new()放在类签名中.如果Bar是一个抽象类,我同意这个,但是如果Bar标准的非抽象类具有公共无参数构造函数,为什么需要这样.
如果未找到new(),编译器将提示以下消息.
无法创建变量类型"T"的实例,因为它没有new()约束
Rub*_*ink 22
因为通常不会假设模板参数需要[非抽象和]可构造[通过公共无参数构造函数],以便Type匹配模板参数定义.
:new()在模板上添加约束之前:
TT与抽象类型或类型匹配,而无需公共无参数构造函数该:Bar位是正交的,意味着:
BarTs到Bar或派生类型Bar体内Bar在TAak*_*shM 11
仅仅因为Bar类定义了一个无参数的构造函数,并不意味着所有的东西Bar都会这样做 - 可能有一个继承自Bar但隐藏无参数构造函数的类.这样的类会满足Bar约束,但正确地使new()约束失败.
(请注意,如果您Bar sealed要避免这种可能性,您可以(可以理解)不再将其用作通用约束) - 编辑尝试此操作会产生编译器错误CS0701.