Tôi biết điều này là cũ, nhưng tôi vẫn không hiểu rõ những vấn đề đó. Bất cứ ai có thể cho tôi biết lý do tại sao sau đây không hoạt động (ném một ngoại lệ runtime
về đúc)?Generics and casting - không thể truyền lớp kế thừa đến lớp cơ sở
public abstract class EntityBase { }
public class MyEntity : EntityBase { }
public abstract class RepositoryBase<T> where T : EntityBase { }
public class MyEntityRepository : RepositoryBase<MyEntity> { }
Và bây giờ dòng đúc:
MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever
RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;
Vì vậy, bất cứ ai có thể giải thích như thế nào đây là không hợp lệ? Và, tôi không có tâm trạng để giải thích - có một dòng mã tôi có thể sử dụng để thực sự làm diễn viên này không?
Cảm ơn mọi người vì câu trả lời. Để làm cho nó ngắn - Bây giờ tôi đã giải quyết vấn đề này với một giao diện cơ sở (RepositoryBase: IRepository). Hóa ra tôi chỉ cần thực hiện các hàm trên cá thể mà tôi nhận được và để cho chính lớp đó xử lý những thứ khác. –
Jefim
Xem câu hỏi thường gặp [C# Hiệp phương sai và câu hỏi thường gặp] (http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx) –