Tôi gặp một số rắc rối hiểu tại sao đoạn sau đây không cho tôi một lỗichế Generic cho hành động không hoạt động như mong đợi
public void SomeMethod<T>(T arg) where T : MyInterface
{
MyInterface e = arg;
}
Nhưng thế này, mà tôi mong chờ để làm việc do sự chung loại chế
private readonly IList<Action<MyInterface>> myActionList = new List<Action<MyInterface>>();
public IDisposable Subscribe<T>(Action<T> callback) where T: MyInterface
{
myActionList.Add(callback); // doesn't compile
return null
}
Cung cấp cho lỗi này
cannot convert from 'System.Action<T>' to 'System.Action<MyInterface>'
tôi đang sử dụng sp1 VS2012 và .NET 4.5.
Bất cứ ai có thể giải thích lý do tại sao ràng buộc không cho phép điều này biên dịch?
Tại sao danh sách của bạn chỉ đọc, và tại sao "mới IList'? Đó có phải là tuyên bố thực sự? –
Các lớp học và đại biểu không giống nhau. 'System.Action' đại diện cho một hàm với một tham số duy nhất của kiểu 'MyInterface' trong khi' System.Action 'đại diện cho một phương thức có tham số kiểu' T: MyInterface'. Các chữ ký chức năng không tương thích, nó không liên quan đến 'T' là một dẫn xuất của' MyInterface', chữ ký sẽ chỉ tương thích nếu 'T' chính xác là' MyInterface'. –
@PaoloTedesco xin lỗi, nó được xây dựng lại và đơn giản hóa từ một số mã khác. Sao chép/Dán lỗi –