2011-01-20 15 views
1

私は一般的なコンテナクラスを持っています。私はOfTypeルーチンを記述しようとしています。しかし、私が渡している型もジェネリックです。ここでは例です:書く方法OfType <Foo<Bar>>()

Entities.OfType<Foo<Bar>>() 

と私の関数の定義:

public IEnumerable T OfType<T>() 
{ 
    foreach (var e in Values) 
     if (e is T) 
      yield return (T)e; 
} 

エンティティが、私はFoo<Base>から継承しないFoo<Bar>エラーが出ますFoo<Base>の集合として定義されている場合。しかしBarはBaseから継承します。

この制限はありますか?

+5

共分散および反分散を調べる。 – Mehrdad

+0

[Explicit Casting Problem]の重複可能性(http://stackoverflow.com/questions/1443341/explicit-casting-problem) – thecoop

答えて

2

ノートにありません。

BarおよびBaseはタイプパラメータであり、C#4.0は一般的なインターフェイスの共分散/反分散をサポートしているため、この問題の解決に役立ちます。

interface IFoo<in T> { /* methods, etc. */ } 

IFooにはメソッドがTを返さないことがあります。Fooには、次のように宣言インタフェースがある場合

あなたのコードはC#4.0で動作します。

IFoo<Bar>の変数にIFoo<Base>オブジェクトを割り当てることができます。BarBaseを継承します。これは、の反差異の例です。

0

C#Genericsは共存しません。 Foo<Bar>Foo<Base>継承によって関連しない2つの完全に異なるジェネリック型である - Foo<Bar>代入互換BaseからにもかかわらずBar継承がFoo<Base>

関連する問題