什么时候在C#中有一个公共的无参数构造函数很重要?

什么时候在C#中有一个公共的无参数构造函数很重要?,c#,generics,type-constraints,C#,Generics,Type Constraints,我试图理解C#中泛型类型参数的定义。where T:new()约束的目的是什么?为什么需要坚持类型参数有一个公共的无参数构造函数 编辑: 我一定错过了什么。评级最高的答案是,公共无参数构造函数是实例化泛型类型所必需的。如果是这样,为什么要编译并运行此代码 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() {

我试图理解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
    }
}
命名空间窗口窗体应用程序1
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
//类Foo没有公共的无参数构造函数
var test=新的genericClass();
}
}
类genericClass,其中T:new()
{
T test=new T();//实例化时没有问题
}
福班
{
//这里没有公共的无参数构造函数
}
}

Edit:在他的评论中,gabe提醒我,如果我不定义构造函数,编译器默认会提供一个无参数的构造函数。因此,在我的示例中,类Foo实际上有一个公共的无参数构造函数。

如果您想实例化一个新的
T

void MyMethod<T>() where T : new()
{
  T foo = new T();
  ...
}
void MyMethod(),其中T:new()
{
T foo=新的T();
...
}

当任何方法创建类型为
T
的对象时,当您想要编写
新T()时,这是必需的
在泛型方法/类中,您需要该约束,因此
T create(/*…*/)
可能需要它此外,我认为序列化需要一个公共的无参数构造函数…

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

@Frank:您不能从泛型类型参数继承。因为我的不完整答案是获得了很多支持票,所以我选择了community wiki。请随时更新它以形成更完整的答案。@Greg,如何在give
Type
对象上发现它有一个公共的无参数构造函数?更正确的说法是:反序列化。我不认为序列化本身有任何构造函数要求。不要忘记,如果不指定任何构造函数,默认情况下会得到一个公共的无参数构造函数。
void MyMethod<T>() where T : new()
{
  T foo = new T();
  ...
}