I'm trying to understand the constraints on generic type parameters in C#. What is the purpose of the where T : new()
constraint? Why would you need to insist that the type argument have a public parameterless constructor?
Edit: I must be missing something. The highest rated answer says the public parameterless constructor is nece开发者_C百科ssary to instantiate the generic type. If that's the case, why the does this code compile and run?
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
}
}
Edit: In his comment, gabe reminded me that if I don't define a constructor, the compiler provides a parameterless one by default. So, class Foo in my example actually does have a public parameterless constructor.
If you want to instantiate a new T
.
void MyMethod<T>() where T : new()
{
T foo = new T();
...
}
Also, I believe that serialization requires a public parameterless constructor...
I don't know about serizlization, but I can mention that COM objects require a parameterless constructor as parameterized constructors are not supported, as far as I know.
That is necessary whenever any method is creating an object of type T
.
When ever you would want to write new T();
inside a generic method/class you'll need that constraint so T create<T>(/*...*/)
would probably need it
精彩评论