强制转换为泛型基类失败

本文关键字:基类 失败 泛型 转换 | 更新日期: 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>;
}