Hãy xem xét các lớp sau đây:Class và mức Phương pháp chung loại hạn chế tương tác
public class DerivedClassPool<TBase> where TBase : class
{
public TBase Get(Type componentType)
{
// Not important, but you get the idea
return Activator.CreateInstance(componentType) as TBase;
}
public TDerived SomeMethod<TDerived>() where TDerived : TBase
{
return Get(typeof(TBase)) as TDerived;
}
}
Lưu ý rằng tôi đã hạn chế đối số lớp generic TBase
là một lớp: where TBase : class
Tôi cũng hạn chế TDerived
chung đối số phương thức là TBase
hoặc một cái gì đó bắt nguồn từ đó: where TDerived : TBase
.
tôi nhận được một lỗi trên as TDerived
dòng:
Tham số loại 'TDerived' không thể được sử dụng với 'là' điều hành bởi vì nó không có một hạn chế loại lớp hay một 'lớp' chế
tôi hiểu rằng để ngăn chặn các lỗi tôi cần phải thêm các hạn chế class
, vì vậy tôi muốn nhận được:
where TDerived : class, TBase
Tại sao tôi phải làm điều này khi TBase
đã bị ràng buộc là một lớp và TDerived
bị ràng buộc là TBase
hoặc bắt nguồn từ nó?
Xem http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagation. Eric đưa nó ra khỏi đó. –
@ Jason, tôi nghĩ rằng nó đọc tốt hơn với 'nhưng'. – Joey
@Joey: Đủ công bằng. Tôi chỉ ghét khi câu bắt đầu bằng 'nhưng', mặc dù việc sử dụng các từ ghép để bắt đầu câu được coi là chính xác trong những ngày này. Tôi đổ lỗi cho giáo viên tiếng Anh trung học của tôi. Ông là một người gắn bó cho các công ước tiếng Anh cổ điển. –