2011-05-12 93 views
3

我无法理解为什么我尝试转换为泛型基类不工作。Casting to Generic基类失败

代码的基本结构如下。

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> 

基地执行这条线后始终为空。

更改为仅针对上下文特定的转换,它工作。

var base = cmd as Cmd<MyContext>  -- this works ??? 

希望我已经提供了足够的信息,这是一个协变\逆变问题吗?

谢谢

回答

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>; 
}