4

我试图了解 C# 中泛型类型参数的约束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 实际上确实有一个公共的无参数构造函数。

4

5 回答 5

12

如果你想实例化一个新的T.

void MyMethod<T>() where T : new()
{
  T foo = new T();
  ...
}
于 2010-03-15T19:24:06.907 回答
4

另外,我相信序列化需要一个公共的无参数构造函数......

于 2010-03-15T19:26:04.830 回答
2

我不知道序列化,但我可以提到 COM 对象需要无参数构造函数,因为据我所知,不支持参数化构造函数。

于 2010-03-15T19:28:26.853 回答
1

每当任何方法创建类型的对象时,这都是必需的T

于 2010-03-15T19:24:25.893 回答
0

当您想new T();在通用方法/类中编写时,您将需要该约束,因此T create<T>(/*...*/)可能需要它

于 2010-03-15T19:25:36.250 回答