2009-07-06 30 views

Trả lời

36

Đây là một ràng buộc đối với tham số chung của lớp, có nghĩa là bất kỳ loại nào được chuyển thành loại chung phải có hàm tạo tham số.

Vì vậy,

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

sẽ là một loại hợp lệ. Bạn có thể tạo một phiên bản mới của A<C>.

Tuy nhiên,

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

sẽ không đáp ứng các hạn chế, và bạn sẽ không được phép để tạo ra một thể hiện mới của A<D>. Nếu bạn cũng thêm một hàm tạo parameterless vào D, thì nó sẽ lại hợp lệ.

+5

Ngoài ra, nếu bạn có() là ràng buộc chung, bạn có thể thực hiện T hàm tổng quát, như sau: T instance = new T(); Nếu không có mới() là ràng buộc, không có cách nào để khởi tạo trực tiếp các lớp (bạn vẫn có thể sử dụng một nhà máy tĩnh, nếu bạn có một ràng buộc đối với một lớp cụ thể) – Steffen

+0

Điểm tốt. Bạn thực sự nhận được một lỗi biên dịch nếu bạn cố gắng làm điều đó, đó là một cách hay để nhắc bạn thêm ràng buộc. – womp

3

Ràng buộc mới() có nghĩa là T phải có một hàm tạo tham số công khai. Bất kỳ cuộc gọi nào đến T() đều được chuyển thành các cuộc gọi đến các quá tải khác nhau của Activator.CreateInstance(). Một cách tiếp cận linh hoạt hơn (ví dụ: nếu các nhà thầu cần các đối số hoặc nội bộ thay vì công khai) là sử dụng một đại biểu:

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)); 
} 
Các vấn đề liên quan