泛型與轉換:了解轉換限制
儘管這種情況很常見,但將繼承的類別轉換為基底類別可能很棘手,例如:嘗試以下程式碼時遇到執行時間異常:
public abstract class EntityBase { } public class MyEntity : EntityBase { } public abstract class RepositoryBase<T> where T : EntityBase { } public class MyEntityRepository : RepositoryBase<MyEntity> { } MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;
此轉換失敗,因為RepositoryBase
這種限制的根本原因在於通用變異數的概念。通用方差是指類型以協變或逆變方式變更其參數化的能力。但是,這種形式的泛型變體在 C# 中僅部分受支持,主要用於泛型介面和委託。
在更通用的上下文中,協變變體允許派生類型在給定場景中替換其基底類型。這意味著從 RepositoryBase
例如,考慮RepositoryBase
void Add(T entity) { ... }
將MyEntityRepository 轉換為RepositoryBase
在 C# 4 中,泛型介面和委託中的引用類型允許泛型方差,但類別不允許。有關更多詳細信息,請參閱 Microsoft 的 MSDN 文件、Eric Lippert 的博客系列或 2010 年 7 月在 NDC 上進行的演示視頻。
以上是為什麼在 C# 中將 `MyEntityRepository` 轉換為 `RepositoryBase` 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!