转换为通用基类失败
我没有理解为什么我试图转换为通用基类不起作用。
代码的基本结构如下。
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; }