首页 > 后端开发 > C++ > 为什么在 C# 中从派生类型转换为基本泛型类型失败?

为什么在 C# 中从派生类型转换为基本泛型类型失败?

Patricia Arquette
发布: 2025-01-06 02:19:40
原创
498 人浏览过

Why Does Casting from a Derived to a Base Generic Type Fail in C#?

从派生泛型类型转换为基本泛型类型:深入研究不兼容性

在 C# 中,泛型类型的继承模型通常会导致以下问题:从派生类型转换为基类型。此查询探讨了潜在的复杂性以及为什么从派生类到其基类的直接转换可能会失败。

转换之谜

考虑以下代码片段:

public abstract class EntityBase { }
public class MyEntity : EntityBase { }

public abstract class RepositoryBase<T> where T : EntityBase { }
public class MyEntityRepository : RepositoryBase<MyEntity> { }
登录后复制

现在,让我们检查一下有问题的line:

MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever
RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;
登录后复制

运行这段代码,会遇到运行时异常。为什么此转换尝试失败?

通用方差:兼容性的幻觉

直观上,我们可能会假设像 MyEntityRepository 这样的派生类也是其基类的一种类型类,RepositoryBase。然而,在泛型领域,这种假设并不总是有效。

泛型方差是指泛型类型用或多或少的派生类型替换其类型参数的能力。不幸的是,C# 仅在某些特定场景中支持有限的变化。

在此示例中,RepositoryBase不是 MyEntityRepository 的基类。这是因为类型参数 T 相对于其基类型不是协变或逆变的。

协变:单边之旅

协变允许泛型类引用比其基类更加派生的类型参数。在泛型类型仅使用其类型参数返回值的某些情况下,这是允许的。然而,这里的情况并非如此。

逆变:一场艰苦的战斗

另一方面,逆变允许泛型类型使用派生较少的类型参数接受值时比其基类更重要。但同样,这在这种情况下不适用。

通用安全的保护

如果没有通用方差,从派生类型转换为基本类型可能会导致意外的结果行为和潜在的运行时错误。例如,如果 RepositoryBase类有一个只能对 EntityBase 类型的实体进行操作的方法,将 MyEntityRepository 转换为 RepositoryBase可能允许无效操作。

避免转换陷阱

如果您需要在泛型类型之间进行转换,则必须了解泛型方差的限制。考虑引入从基类到派生类的显式转换,或使用工厂方法或桥模式等替代设计模式来避免这些陷阱。

以上是为什么在 C# 中从派生类型转换为基本泛型类型失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板