2011-11-15 24 views
14

Ví dụ 1 (không biên dịch):Làm thế nào để Lazy <T> nhận được xung quanh cần ràng buộc mới()?

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

Kết quả:

Không thể tạo một thể hiện của kiểu biến 'T' bởi vì nó không có() ràng buộc mới

Ví dụ 2 (công trình):

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 

Trả lời

17

Nếu bạn đi sâu vào mã nguồn, bạn sẽ thấy rằng Lazy<T> cuối cùng sử dụng Activator:

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

Đây chỉ là một phím tắt cho việc sử dụng phản ánh. Vì nó không khởi tạo kiểu thông qua đối số kiểu chung chung thực tế (new T()) mà đúng hơn là gọi hàm tạo thông qua sự phản chiếu, không cần có ràng buộc where T : new().

Các vấn đề liên quan