如何在c#中实现泛型多态性?
为了避免混淆,我总结了一些代码:如何在c#中实现泛型多态性?,c#,generics,inheritance,casting,covariance,C#,Generics,Inheritance,Casting,Covariance,为了避免混淆,我总结了一些代码: 命名空间控制台应用程序1 { 班级计划 { 静态void Main() { IManager specificManager=新SpecificEntityManager(); IManager manager=(IManager)specificManager; manager.dostufwith(新的SpecificEntity()); } } 内部接口识别器 { } 内部接口isSpecificEntity:IIdentifier { } 内部类特定实体
命名空间控制台应用程序1
{
班级计划
{
静态void Main()
{
IManager specificManager=新SpecificEntityManager();
IManager manager=(IManager)specificManager;
manager.dostufwith(新的SpecificEntity());
}
}
内部接口识别器
{
}
内部接口isSpecificEntity:IIdentifier
{
}
内部类特定实体:isSpecificEntity
{
}
内部接口IManager,其中TIdentifier:IIdentifier
{
无效Dostufwith(TIdentifier实体);
}
内部类SpecificEntityManager:IManager
{
公共无效Dostufwith(isSpecificEntity-specificEntity)
{
}
}
}
调试代码时,我在Main()
中得到一个InvalidCastException
我知道,isSpecificEntity
实现了IIdentifier
。
但显然,从IManager
到IManager
的直接转换不起作用
我认为使用协方差可以做到这一点,但将IManager
更改为IManager
也没有帮助
那么,有没有办法将specificManager
转换为IManager
谢谢,祝您一切顺利。使用IManager
您可以执行以下操作:
IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
这将导致您的SpecificEntityManager
中出现异常,因为它只接受类型为isSpecificEntity
更新:
你可以在阅读更多关于C#中协方差和逆变的信息,为什么不:
ISpecificEntity bankAccountManager = new SpecificEntity();
IManager<IIdentifier> manager = (IManager<IIdentifier>)bankAccountManager;
manager.DoStuffWith(new SpecificEntity());
isSpecificEntity bankAccountManager=新的SpecificEntity();
IManager=(IManager)bankAccountManager;
manager.dostufwith(新的SpecificEntity());
请阅读:。。。这就是为什么不允许它做OP想做的事+1但是
isSpecificEntity
实现IIdentifier
。而IManager中的TIdentifier
只接受IIdentifier
。因此,这一行不应该有例外。我错了吗?嗯,你是对的。我想我必须更改我的摘要代码。它不适用于原始代码中的问题。因为specificeentity
不是i管理器
,而是i标识符
。