Tôi hy vọng câu hỏi là chính xác, vì vậy hãy cho bạn một ví dụ. Hãy tưởng tượng các phương pháp chung như sau:Tại sao VS cảnh báo tôi rằng typeof (T) không bao giờ là loại được cung cấp trong một phương pháp chung mà tham số kiểu bị hạn chế để thực hiện T?
public abstract class Base : IDisposable
{
public static IEnumerable<T> GetList<T>()
where T : Base
{
// To ensure T inherits from Base.
if (typeof(T) is Base)
throw new NotSupportedException();
// ...
}
}
Theo MSDN từ khóa where
hạn chế tham số kiểu T
là loại Base
hoặc kế thừa từ lớp này.
[...] mệnh đề where có thể bao gồm ràng buộc lớp cơ sở, cho biết loại phải có lớp được chỉ định làm lớp cơ sở (hoặc chính lớp đó) để được sử dụng làm loại đối số cho loại chung đó.
Ngoài ra mã này không biên dịch:
public static T GetFirst()
where T : Base
{
// Call GetList explicitly using Base as type parameter.
return (T)GetList<Base>().First();
}
Vì vậy, khi sau mã cuối cùng typeof(T)
nên trở Base
, không nên nó? Tại sao Visual Studio sau đó in cảnh báo này cho tôi?
cảnh báo CS0184: Biểu thức đã cho không bao giờ được cung cấp (loại 'Demo.Base').
Bạn muốn làm gì? Đảm bảo rằng 'T' kế thừa từ' Base' là vô ích, vì hạn chế chung đã đảm bảo điều đó. – CodesInChaos
Ràng buộc đảm bảo rằng 'T' hoặc kế thừa từ' Base' ** OR ** là 'Base'. Tôi muốn 'T' chỉ kế thừa từ' Base'. – Carsten