泛型和转换:了解转换限制
尽管这种情况很常见,但将继承的类转换为基类可能很棘手,例如:尝试以下代码时遇到运行时异常:
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中文网其他相关文章!