2011-05-12 126 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>; 
}