[英]How to implement generic polymorphism in c#?
to avoid confusion I summarised some code: 为了避免混淆,我总结了一些代码:
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
IManager<ISpecificEntity> specificManager = new SpecificEntityManager();
IManager<IIdentifier> manager = (IManager<IIdentifier>) specificManager;
manager.DoStuffWith(new SpecificEntity());
}
}
internal interface IIdentifier
{
}
internal interface ISpecificEntity : IIdentifier
{
}
internal class SpecificEntity : ISpecificEntity
{
}
internal interface IManager<TIdentifier> where TIdentifier : IIdentifier
{
void DoStuffWith(TIdentifier entity);
}
internal class SpecificEntityManager : IManager<ISpecificEntity>
{
public void DoStuffWith(ISpecificEntity specificEntity)
{
}
}
}
When I debug the code I get an InvalidCastException in Main()
. 当我调试代码时,我在Main()
得到一个InvalidCastException。
I know that ISpecificEntity
implements IIdentifier
. 我知道ISpecificEntity
实现了IIdentifier
。 But obviously a direct cast from an IManager<ISpecificEntity>
into an IManager<IIdentifier>
does not work. 但显然从IManager<ISpecificEntity>
转换为IManager<IIdentifier>
不起作用。
I thought working with covariance could do the trick but changing IManager<TIdentifier>
into IManager<in TIdentifier>
does not help either. 我认为使用协方差可以解决问题,但将IManager<TIdentifier>
更改为IManager<in TIdentifier>
也无济于事。
So, is there a way do cast specificManager
into an IManager<IIdentifier>
? 那么,有没有办法将specificManager
转换为IManager<IIdentifier>
?
Thanks and all the best. 谢谢,一切顺利。
With IManager<IIdentifier>
you can do such thing: 使用IManager<IIdentifier>
您可以执行以下操作:
IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
That will lead to exception, in your SpecificEntityManager
, because it accepts only parameters of type ISpecificEntity
这将在您的SpecificEntityManager
导致异常,因为它只接受ISpecificEntity
类型的参数
UPDATE: You can read more about covariance and contravariance in C# at Eric Lippert's blog 更新:您可以在Eric Lippert的博客中阅读有关C#中的协方差和逆变的更多信息
Why not: 为什么不:
ISpecificEntity bankAccountManager = new SpecificEntity();
IManager<IIdentifier> manager = (IManager<IIdentifier>)bankAccountManager;
manager.DoStuffWith(new SpecificEntity());
? ?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.