2010-11-24 16 views
3

私は、次のと失敗をやろうとしています:多型解像度

class base {} 

class derived1 : base {} 

class derived2 : base {} 

interface itr<t> 
where t : class, base 
{} 

class c1: itr<derived1> 
{} 

class c2 : itr<derived2> 
{} 

//以下の2件の登録が失敗:

_unityContainer.RegisterType<itr<base>, c1>("c1"); 

_unityContainer.RegisterType<itr<base>, c2>("c2"); 

私が手にエラーがあることです上記登録の第2パラメータは第1パラメータに型キャストすることができず、この登録は無効です。どのように私はこれを行うことができます上の任意の提案?
解決している間に私が解決している派生型を正確に知る必要がないため、derived1クラスまたはderived2クラスを汎用パラメータとして登録する代わりに、上記を行う必要があります。私はベース型のメソッドを多態的に扱うだけです。

答えて

5

ジェネリックが共変ではないため、これを行うことはできません。つまり、タイプitr<derived1>derived1baseに変換することはできますが、itr<base>に変換することはできません。

はここでフレームワークList<T>クラスを使用する理由の例です:

List<string> list1 = new List<string>(); 
list1.Add("Hello, World!"); 

// This cast will fail, because the following line would then be legal: 
List<object> list2 = (List<object>)list1; 

// ints are objects, but they are not strings! 
list2.Add(1); 

のでstring Sを含むように宣言されたリスト内の箱入りintを返しますlist1[1]にアクセスします。

したがって、キャストは許可されません。これは型システムを破壊するためです。

(注意点として、句where t : class, baseに、あなたはclassを指定する必要はありません。base自体参照型なので、class制約は冗長である。)