强制转换为泛型基类失败
本文关键字:基类 失败 泛型 转换 | 更新日期: 2023-09-27 17:56:08
我不明白为什么我尝试强制转换为通用基类不起作用。
代码的基本结构如下。
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 ???
希望我提供了足够的信息,这是一个协方差''逆变问题吗?
谢谢
您可能希望使用协变和逆变。
问题是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>;
}