【发布时间】:2011-03-03 23:19:56
【问题描述】:
我想也许有人能回答这个问题,这是一个出于好奇的问题:
.NET v2 中引入的来自System.Activator 的泛型CreateInstance 方法对泛型参数没有类型限制,但需要激活类型的默认构造函数,否则会抛出MissingMethodException。对我来说,这个方法似乎很明显应该有一个类型约束,比如
Activator.CreateInstance<T>() where T : new() {
...
}
只是一个遗漏或一些轶事潜伏在这里?
更新
正如所指出的,编译器不允许你写
private T Create<T>() where T : struct, new()
error CS0451: The 'new()' constraint cannot be used with the 'struct' constraint
但是,请参阅 cmets,结构可以用作指定 new() 约束的泛型方法的类型参数。在这种情况下,给定的答案似乎是不限制方法的唯一正当理由......
感谢您查看此内容!
【问题讨论】:
-
+1 非常有趣的问题。我想不出它不应该在那里的原因,所以我也很想知道为什么!
-
关于你的更新,因为它是多余的;所有值类型都有一个默认构造函数,它将所有值初始化为默认值(这是你调用
default(T)时得到的。 -
所有结构在 C# 中都有默认的 ctors。
-
澄清一下,鉴于
void Foo<T>() where T:new() {}、Foo<DateTime>();或Foo<int>();都是编译器不会抱怨的完全有效的调用。 -
很好的问题。我很困惑。
new约束似乎是与泛型同时引入的,因此它不像是向后兼容问题。也许他们只是忘记了?
标签: c# .net clr c#-2.0 base-class-library