2011-11-15 30 views
14

Örnek 1 (derleme değil):Lazy <T>, yeni() kısıtlamaya ihtiyaç duyuyor mu?

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"); } 
} 

Sonuç:

yeni() kısıtlamasını

olmadığı için değişken türü 'T' bir örneğini oluşturulamıyor

Örnek 2 (eser):

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:

Eğer kaynak koduna defterleri ise
i was created 

cevap

17

, sen Lazy<T> sonuçta Activator kullandığını görürsünüz:

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

Bu sadece yansıma kullanmak için bir kısa yoldur. Türü gerçek jenerik tür argümanı (new T()) aracılığıyla değil, yapıcıyı yansıtma yoluyla çağırmaktan dolayı, where T : new() kısıtlaması gerekmez.

İlgili konular