views:

201

answers:

5

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 necessary 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.

+11  A: 

If you want to instantiate a new T.

void MyMethod<T>() where T : new()
{
  T foo = new T();
  ...
}
Greg
@Frank: You cannot inherit from a generic type parameter.
Adam Robinson
Since my incomplete answer was getting many upvotes, I made it community wiki. Please feel free to update it to form a more complete answer.
Greg
+1  A: 

That is necessary whenever any method is creating an object of type T.

Otávio Décio
A: 

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

Rune FS
+4  A: 

Also, I believe that serialization requires a public parameterless constructor...

kmontgom
More correctly: deserialization. I don't think serialization itself has any constructor requirements.
yodaj007
+2  A: 

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.

Will Marcouiller