5

以下の「x」が変換される理由がわかりませんが、「y」と「z」は変換されません。

var list = new List<List<int>>();

IEnumerable<List<int>> x = list;
List<IEnumerable<int>> y = list;
IEnumerable<IEnumerable<int>> z = list;

新しい共分散機能は単にジェネリックのジェネリックでは機能しないのですか、それとも何か間違っていますか? (y と z を機能させるために .Cast<> を使用することは避けたいと思います。)

4

2 に答える 2

7

"z" は C# 4.0 では問題なく、IEnumerable<T>共変です。 List<T>ただし、「y」を機能させることはできません。

直感的に、もしそうなら、これは有効です:

List<IEnumerable<int>> y = list
y.Add(new Stack<int>());

List<int>これは、「リスト」に要素のみを含めることができるという約束を破っています。

于 2010-04-21T16:36:19.070 に答える
1

ここでいくつかの間違いを犯しています。まず、共変性と反変性は値型ではサポートされていないため、「int」で何をしようとしてもうまくいきません。

次に、ネストされたジェネリック型の差異をチェックする有効な例は、次のようになります。

var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list; 

文字列のリストのリストを、オブジェクトの IEnumerable の IEnumerable に割り当てることができます。これが共分散です。詳細については、共分散と反分散に関する FAQ を参照してください。

于 2010-04-21T20:46:11.733 に答える