ある汎用コンテナを別のコンテナに変換すると非常に便利なので、わかりませんか?
Stack <IType> stack = new Stack<SomeType>();
ある汎用コンテナを別のコンテナに変換すると非常に便利なので、わかりませんか?
Stack <IType> stack = new Stack<SomeType>();
あなたはそのような変換について話しているのですか?
IFoo<Child> child = ...;
IFoo<Parent> parent = child;
もしそうなら、これは共分散として知られているものです。これは通常、対応する反変とペアになっています。この機能は、C# の現在のバージョンでは利用できません。ただし、C# と VB.Net の両方の次のバージョンで利用できるようになります。
今後のリリースに関するいくつかの記事
@JaredParの言うことは真実ですが、現在利用可能なコレクションにはいくつかの回避策があります。たとえば、あるタイプから別のタイプへの正当なキャストがある場合は、CastIEnumerable拡張機能を使用できます。
List<Foo> list = barList.Cast<Foo>().ToList();
または、Selectを使用して、あるタイプから別のタイプに明示的に変換することもできます。
List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();
これらのメソッドは両方とも、C#/ VBの次のバージョンで特定の条件下で使用できるように、コレクションを別のタイプの変数に割り当てるだけでなく、適切なタイプの新しいコレクションを生成することに注意してください。
あなたが与えた例に関して:
Stack <IType> stack = new Stack<SomeType>();
これを行うとどうなりますか:
stack.Add(new SomeOtherTypeNotDerivedFromSomeType());
これが、.Netで共分散が許可されない基本的な理由です。これは、汎用コンテナーの基になるコレクションが、宣言された型と必ずしも一致しないためだと思います。Eric Lippertの記事は、(私が実際にできる以上に)非常に詳細に説明されています。