转换为通用基类失败

我没有理解为什么我试图转换为通用基类不起作用。

代码的基本结构如下。

interface ICmd { } class Context { } class Cmd : ICmd where TContext : Context { } class MyContext : Context { } class MyCmd : Cmd { } 

所以现在我有一个ICmd的实例,并希望将其转换为Cmd,如下所示

 var base = cmd as Cmd 

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

将强制转换更改为仅适用于上下文并且有效。

 var base = cmd as Cmd -- this works ??? 

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

谢谢

您可能想要使用共同和逆变 。

问题是Cmd 不是 Cmd的基类。

有关更详细的答案,请参阅最近的问题: C#genericsinheritance问题

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

 interface ICmd where TContext : Context { } class Cmd : ICmd where TContext : Context { } static void Main(string[] args) { Cmd cmd = new Cmd(); var foo = cmd as ICmd; }