Bạn hỏi, "tôi không thể chuyển TẤT CẢ các tham chiếu của T
trong lớp học này bằng ISomething
?" Vì vậy, tôi nghĩ bạn có nghĩa là để so sánh:
public class MyClass<T> where T : ISomething
{
public T MyProperty { get; set; }
}
Với:
public class MyClass
{
public ISomething MyProperty { get; set; }
}
Trong ví dụ thứ hai, MyProperty
chỉ đảm bảo được một thể hiện của ISomething
. Trong ví dụ đầu tiên, MyProperty
là bất cứ điều gì T
là, ngay cả khi đó là loại phụ cụ thể của ISomething
. Hãy xem xét một thực hiện cụ thể của ISomething
:
public class MySomething : ISomething
{
public string MyOtherProperty { get; set; }
}
Bây giờ, nếu chúng ta sử dụng đầu tiên, chung chung, ví dụ, chúng ta có thể có:
MyClass<MySomething> myClass = new MyClass<MySomething>();
Console.WriteLine(myClass.MyProperty.MyOtherProperty);
Mặt khác, nếu chúng ta sử dụng ví dụ thứ hai, chúng tôi sẽ không thể truy cập vào MyOtherProperty
vì nó chỉ được biết đến là một ISomething
:
MyClass myClass = new MyClass();
Console.WriteLine(myClass.MyProperty.MyOtherProperty); // Won't compile, no property "MyOtherProperty"
Trên một lưu ý khác nhau, lý do những khó khăn kiểu này rất hữu ích là bạn có thể tham khảo MyProperty
(loại T
) và truy cập các thành viên của ISomething
. Nói cách khác, nếu ISomething
được khai báo như:
public interface ISomething
{
public string SomeProperty { get; set; }
}
Sau đó, bạn có thể truy cập MyProperty.SomeProperty
. Nếu bạn bỏ qua số where T : ISomething
thì bạn sẽ không thể truy cập SomeProperty
từ T
sẽ chỉ được biết là loại object
.
http://msdn.microsoft.com/en-us/library/d5x73970.aspx – zebrabox