2011-11-15 7 views
14

Ejemplo 1 (no compilar):¿Cómo funciona Lazy <T> que necesita la restricción new()?

void Main() 
{ 
    var c = new C<D>(); 
    c.M.F(); 
} 

class C<T> 
{ 
    T _m = null; 
    public T M { get { 
     if(_m == null) _m = new T(); 
     return _m; 
    } } 
} 

class D 
{ 
    public void F() { Console.WriteLine ("i was created"); } 
} 

Resultado:

No se puede crear una instancia del tipo de variable de 'T', ya que no tiene el nuevo() restricción

Ejemplo 2 (obras):

void Main() 
{ 
    var c = new C<D>(); 
    c.M.F(); 
} 

class C<T> 
{ 
    Lazy<T> _m = new Lazy<T>(); 
    public T M { get { return _m.Value; } } 
} 

class D 
{ 
    public void F() { Console.WriteLine ("i was created"); } 
} 

Resul t:

i was created 

Respuesta

17

Si profundizar en el código fuente, se dará cuenta de que en última instancia Lazy<T> utiliza Activator:

return new Lazy<T>.Boxed((T)Activator.CreateInstance(typeof(T))); 

Esto es sólo un acceso directo para el uso de la reflexión. Como no crea una instancia del tipo mediante el argumento de tipo genérico real (new T()) sino que invoca al constructor mediante reflexión, no se necesita ninguna restricción where T : new().

Cuestiones relacionadas