.NET string[] を IEnumerable<string> パラメータとして渡すことができるのはなぜですか?
-
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
.
他のヒント
Array
クラスは、IEnumerable<T>
を実装しています。
アレイは、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>
およびこのインターフェイスの基本インターフェイス(からの暗黙的な参照変換がある場合)S
にT
.
そしてそれを思い出してください IList<T> : IEnumerable<T>