Thomas
Thomas

Reputation: 34188

regarding the use of new Constraint in c#

i never use new Constraint because the use is not clear to me. here i found one sample but i just do not understand the use. here is the code

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}

public class ItemFactory2<T> where T : IComparable, new()

{
}

so anyone please make me understand the use of new Constraint with small & easy sample for real world use. thanks

Upvotes: 16

Views: 13421

Answers (5)

SwDevMan81
SwDevMan81

Reputation: 49978

In addition to Darin's answer, something like this would fail because Bar does not have a parameterless constructor

   class ItemFactory<T> where T : new()
   {
      public T GetNewItem()
      {
         return new T();
      }
   }

   class Foo : ItemFactory<Bar>
   {

   }

   class Bar
   {
      public Bar(int a)
      {

      }
   }

Actual error is: 'Bar' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'ItemFactory<T>'

The following would also fail:

class ItemFactory<T>
{
    public T GetNewItem()
    {
        return new T();
    }
}

Actual error is: Cannot create an instance of the variable type 'T' because it does not have the new() constraint

Upvotes: 7

Darin Dimitrov
Darin Dimitrov

Reputation: 1038730

This constraint requires that the generic type that is used is non-abstract and that it has a default (parameterless) constructor allowing you to call it.

Working example:

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}

which obviously now will force you to have a parameterless constructor for the type that is passed as generic argument:

var factory1 = new ItemFactory<Guid>(); // OK
var factory2 = new ItemFactory<FileInfo>(); // doesn't compile because FileInfo doesn't have a default constructor
var factory3 = new ItemFactory<Stream>(); // doesn't compile because Stream is an abstract class

Non-working example:

class ItemFactory<T>
{
    public T GetNewItem()
    {
        return new T(); // error here => you cannot call the constructor because you don't know if T possess such constructor
    }
}

Upvotes: 14

Josh Earl
Josh Earl

Reputation: 18351

In your example, the constraint acts on <T> in the class declaration. In the first case, it requires that the generic T object has a default (parameterless) constructor. In the second example, it requires that T should have a default, parameterless constructor and that it must implement the IComparable interface.

Upvotes: 0

Sjoerd
Sjoerd

Reputation: 75588

You can read new() as if it is an interface with a constructor. Just like that IComparable specifies that the type T has a method CompareTo, the new constraint specifies that the type T has a public constructor.

Upvotes: 0

S&#246;ren Titze
S&#246;ren Titze

Reputation: 1005

The new constraint specifies that any type argument in a generic class declaration must have a public parameterless constructor.

quoted from the official website

Upvotes: 0

Related Questions