繁体   English   中英

转换为通用基类失败

[英]Casting to Generic base class failing

我不明白为什么我尝试强制转换为通用基类不起作用。

代码的基本结构如下。

interface ICmd
{
}

class Context
{
}

class Cmd<TContext> : ICmd
    where TContext : Context
{
}

class MyContext : Context
{
}

class MyCmd : Cmd<MyContext>
{
}

所以现在我有一个 ICmd 的实例并想将它转换为 Cmd 如下

var base = cmd as Cmd<Context>

执行此行后,base 始终为空。

将转换更改为特定于上下文并且它有效。

var base = cmd as Cmd<MyContext>       -- this works ???

希望我提供了足够的信息,这是协方差\\逆变问题吗?

谢谢

您可能想要使用co- 和 contravariance

问题是Cmd<Context>不是Cmd<MyContext>的基类。

有关更详细的答案,请参阅最近的问题: C# 泛型继承问题

你在这里需要的是协方差。 C# 4 当前不允许类中的泛型类型参数发生变化。 如果您的接口不需要允许在任何输入位置使用TContext ,您可以考虑使接口通用,并在TContext协变:

interface ICmd<out TContext> where TContext : Context { }

class Cmd<TContext> : ICmd<TContext> where TContext : Context { }

static void Main(string[] args)
{
    Cmd<MyContext> cmd = new Cmd<MyContext>();

    var foo = cmd as ICmd<Context>;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM