我正在尝试理解C#中泛型类型参数的constraints。 where T : new()
约束的目的是什么?为什么你需要坚持类型参数有一个公共无参数构造函数?
修改 我肯定错过了什么。评价最高的答案表示公共无参数构造函数是实例化泛型类型所必需的。如果是这种情况,为什么这段代码会编译并运行?
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//class Foo has no public parameterless constructor
var test = new genericClass<Foo>();
}
}
class genericClass<T> where T : new()
{
T test = new T(); //yet no problem instantiating
}
class Foo
{
//no public parameterless constructor here
}
}
编辑:在他的评论中,gabe提醒我,如果我没有定义构造函数,编译器默认提供无参数构造函数。因此,我的示例中的类Foo实际上确实有一个公共无参数构造函数。
答案 0 :(得分:12)
如果要实例化新的T
。
void MyMethod<T>() where T : new()
{
T foo = new T();
...
}
答案 1 :(得分:4)
另外,我认为序列化需要一个公共的无参数构造函数......
答案 2 :(得分:2)
我不知道serizlization,但我可以提一下COM对象需要一个无参数构造函数,因为据我所知,不支持参数化构造函数。
答案 3 :(得分:1)
只要有任何方法创建T
类型的对象,就必须这样做。
答案 4 :(得分:0)
如果您想在通用方法/类中编写new T();
,您将需要该约束,因此T create<T>(/*...*/)
可能需要它