1

この文字列配列を宣言するとしましょう:

string[] arr = new string[]{"foo", "bar"};

LINQ 拡張メソッドがどのように接続されているのでしょうか?

LINQ 拡張メソッドが System.Linq.Enumerable で宣言されていることは知っていますが、拡張メソッドは次のように動作しますIEnumerable<TSource>

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

arr はジェネリックではなく、私の知る限り、拡張メソッドIEnumerable<T>がどのようにアタッチされているかを実装していませんか?Where()

4

1 に答える 1

2

ドキュメントから:

.NET Framework 2.0 以降、Arrayクラスは、、、およびジェネリック インターフェイスを実装System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>ますSystem.Collections.Generic.IEnumerable<T>実装は実行時に配列に提供されるため、ドキュメント ビルド ツールには表示されません。その結果、ジェネリック インターフェイスはArrayクラスの宣言構文に表示されず、配列をジェネリック インターフェイス型にキャストすることによってのみアクセスできるインターフェイス メンバー (明示的なインターフェイス実装) の参照トピックはありません。これらのインターフェイスのいずれかに配列をキャストするときに注意すべき重要な点は、要素を追加、挿入、または削除するメンバーが をスローすることNotSupportedExceptionです。

したがって、T[] を実装IEnumerable<T>しており、コンパイラはその事実を完全に認識しているため、IEnumerable<T>s で定義された拡張メソッドを配列で使用することは完全に合法です。

于 2013-07-26T13:57:56.123 に答える