6

私の質問の文脈をよりよく説明するために、いくつかの仮説から始めます。

配列共分散

仮定 1.1

値型の配列は共変ではありません。int[]お渡しできませんobject[]

仮定 1.2

参照型の配列は、有効な と共変ですIEnumerablestring[]を渡すことができますIEnumerable<object>)。

仮定 1.3

参照型の配列は、有効な共変配列と共変です。string[]を渡すことができobject[]ます。

リストの共分散

仮定 2.1 (1.1 と同じ)

値型のリストは共変ではありません。List<int>お渡しできませんList<object>

仮定 2.2 (1.2 と同じ)

参照型のリストは、有効な と共変ですIEnumerableList<string>を渡すことができますIEnumerable<object>)。

公準 2.3 (1.3 とは異なる)

参照型のリストは、有効な共変と共変ではありませんListList<string>には渡せませんList<object>)。


私の質問は、仮定 1.3、2.2、および 2.3 に関するものです。具体的には:

  1. には合格できるのに、 にはstring[]合格できないのはなぜですか?object[]List<string>List<object>
  2. List<string>for を通過できるのに for を通過できIEnumerable<object>ないのはなぜList<object>ですか?
4

2 に答える 2

-1

配列は共変ですが、System.Int32[]は から派生したものへの参照を保持しませんSystem.Object。.NET ランタイム内では、各値型定義は実際には 2 種類のものを定義します: ヒープ オブジェクト型と値 (格納場所) 型です。ヒープ オブジェクト タイプは から派生していSystem.Objectます。ストレージの場所の型は暗黙のうちにヒープ オブジェクト型 (から派生System.Object) に変換できますが、それ自体は実際には他からも派生しSystem.Objectません。を含むすべての配列System.Int32[]はヒープ オブジェクト型ですが、aの個々の要素System.Int32[]は格納場所型のインスタンスです。

String[]aを期待するコードに渡すことができる理由Object[]は、前者には「 type から派生した型のヒープ オブジェクト インスタンスへの参照」が含まれString、後者には type も同様に含まれるためですObject。からString派生したため、から派生Objectした型のヒープ オブジェクトへの参照は、Stringから派生したヒープ オブジェクトへの参照にもなり、 から派生したヒープ オブジェクトへの参照が含まれます。。_ 対照的に、[ie ] には 型のヒープ オブジェクト インスタンスへの参照が含まれていないため、その内容は を期待しているコードの期待に準拠しません。ObjectString[]ObjectObject[]int[]System.Int32[]Int32Object[]

于 2013-06-12T17:35:22.127 に答える