我无法理解为什么我转换为通用基类的尝试无效。
代码的基本结构如下。
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始终为null。
将强制转换更改为仅适用于上下文并且有效。
var base = cmd as Cmd<MyContext> -- this works ???
希望我提供了足够的信息,这是一个协方差\逆转问题吗?
由于
答案 0 :(得分:9)
您可能想要使用co- and contravariance。
问题是Cmd<Context>
不是 Cmd<MyContext>
的基类。
有关更详细的答案,请参阅最近的问题:C# Generics Inheritance Problem
答案 1 :(得分:2)
这里你需要的是协方差。 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>;
}