2011-11-15 10 views
14

Przykład 1 (nie kompilacji)W jaki sposób Lazy <T> radzi sobie z ograniczeniem 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"); } 
} 

Wynik:

nie może tworzyć instancje zmiennej typu 'T', ponieważ nie mają nowe() ograniczenie

Przykład 2 (prace):

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 

Odpowiedz

17

Jeśli zagłębić się w kodzie źródłowym, zobaczysz, że Lazy<T> ostatecznie wykorzystuje Activator:

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

To tylko skrót użyciu odbicia. Ponieważ nie tworzy instancji typu za pomocą faktycznego generycznego argumentu typu (new T()), ale wywołuje konstruktora za pomocą odbicia, nie jest wymagane ograniczenie więzów where T : new().

Powiązane problemy