.NET string[] を IEnumerable<string> パラメータとして渡すことができるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/701438

  •  22-08-2019
  •  | 
  •  

質問

これは有効なコードです:

void func(IEnumerable<string> strings){
    foreach(string s in strings){
        Console.WriteLine(s);
    }
}

string[] ss = new string[]{"asdf", "fdsa"};
func(ss);

私が知りたいのは、暗黙的な変換がどのように行われるかということです string[] -> IEnumerable<string> 仕事?

役に立ちましたか?

解決

から: msdn 配列クラス

.NET Framework バージョン 2.0 では、 配列クラス を実装します

  • IList<T>,
  • ICollection<T>, 、 そして
  • IEnumerable<T>

汎用インターフェイス。実装は次のとおりです。 実行時に配列に提供される, したがって、ドキュメント作成ツールには表示されません。その結果、ジェネリック インターフェイスは Array クラスの宣言構文に表示されず、配列をジェネリック インターフェイス型 (明示的なインターフェイス実装) にキャストすることによってのみアクセスできるインターフェイス メンバーに関するリファレンス トピックはありません。これらのインターフェイスのいずれかに配列をキャストするときに注意すべき重要な点は、要素を追加、挿入、または削除するメンバーがスローすることです。 NotSupportedException.

他のヒント

非常に奇妙な獣で、コンパイラとJIT(リヒターさんとドン・ボックスの帳簿のそれの詳細、私は推測する)ことで、非常に特別扱いされる

Arrayクラスは、IEnumerable<T>を実装しています。

いずれかのT []のIEnumerable への変換が存在するために、

アレイは、IEnumerableを実装します。

  

どのように暗黙の型変換文字列[] - ?> IEnumerableを作業

ミスの

その種のポイント、を変換はありません。の配列は、(あなたは、ほとんどの方が分かりやすけれ場合は、「継承」と言うことができる)のIEnumerableを実装し、その文字列を[]ので、 はすでにのあるIEnumerableを - 変換するものは何もありません。

これは標準的なインターフェイス変換です。要件として、配列 (T[]) 埋め込む IEnumerable そして IEnumerable<T>. 。それで、 string[] と100%互換性があります IEnumerable<T>. 。実装はコンパイラによって提供されます (配列は、.NET ジェネリックが存在する前は基本的にジェネリックでした)。

仕様 (ECMA 334 v4) によると、これは 13.1.4 の結果です。

  • 1次元配列型から S[]System.Collections.Generic.IList<S> このインターフェイスのベースインターフェイス。
  • 1次元配列型から S[]System.Collections.Generic.IList<T> およびこのインターフェイスの基本インターフェイス(からの暗黙的な参照変換がある場合) ST.

そしてそれを思い出してください IList<T> : IEnumerable<T>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top