2009-07-06 15 views

Respuesta

36

Esta es una limitación para el parámetro genérica de su clase, lo que significa que cualquier tipo que se pasa como el tipo genérico debe tener un constructor sin parámetros.

Así,

public class C : B 
{ 
    public C() {} 
} 

habría un tipo válido. Puede crear una nueva instancia de A<C>.

Sin embargo,

public class D : B 
{ 
    public D(int something) {} 
} 

no habría satisfacer la restricción, y no se le permitiría crear una nueva instancia de A<D>. Si también agregaste un constructor sin parámetros a D, entonces volvería a ser válido.

+5

También si usted tiene nueva() como limitación genérica, en realidad se puede crear una instancia de T en su función genérica, así: T instancia = new T(); Sin restricción new() como restricción, no hay forma de instanciar las clases directamente (aún puede usar una fábrica estática, si tiene una restricción para una clase específica) – Steffen

+0

Buen punto. En realidad obtienes un error de compilación si intentas hacer eso, que es una buena forma de recordarte que agregas la restricción. – womp

3

La nueva restricción() significa que T tiene que tener un constructor público sin parámetros. Todas las llamadas a T() se convierten en llamadas a varias sobrecargas de Activator.CreateInstance(). Un enfoque más flexible (por ejemplo, si los constructores necesitan argumentos, o son internos y no público) es utilizar un delegado:

public class A<T> where T : B 
{ 
    public void Method(Func<T> ctor) 
    { 
     T obj = ctor(); 
     // .... 
    } 
} 

// elsewhere... 
public class C : B 
{ 
    public C(object obj) {} 
} 

public void DoStuff() 
{ 
    A<C> a = new A<C>(); 
    object ctorParam = new object(); 
    a.Method(() => new C(ctorParam)); 
}