转换为通用基类失败

时间:2011-05-12 13:46:44

标签: c# .net generics

我无法理解为什么我转换为通用基类的尝试无效。

代码的基本结构如下。

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 ???

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

由于

2 个答案:

答案 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>;
}
相关问题