79

新しい .NET 3.5 プログラマとして、LINQ の学習を開始したところ、これまで気付かなかった非常に基本的なことがわかりました。

この本は、すべての配列が実装されていると主張していますIEnumerable<T>(明らかに、そうでなければ配列上のオブジェクトに LINQ を使用できませんでした...)。これを見たとき、私はそれについて本当に考えたことはなかったと思い、すべての配列が他に何を実装しているかを自問しました。そこで System.Array、オブジェクト ブラウザーを使用して調べました (これは CLR のすべての配列の基本クラスであるため)。驚いたことに、それは実装されていませんIEnumerable<T>

だから私の質問は:定義はどこですか?つまり、すべての配列がどのインターフェイスを実装しているかを正確に知るにはどうすればよいでしょうか?

4

5 に答える 5

81

ドキュメントから(強調鉱山):

[...] Array クラスは、、、およびジェネリック インターフェイスを実装System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>ますSystem.Collections.Generic.IEnumerable<T>実装は実行時に配列に提供されるため、ドキュメント ビルド ツールには表示されません。

編集: Jb Evain がコメントで指摘しているように、ベクター (1 次元配列) のみが汎用インターフェイスを実装します。多次元配列がジェネリック インターフェイスを実装しない理由については、非ジェネリックの対応するものを実装しているため、よくわかりません (以下のクラス宣言を参照)

System.Arrayクラス (つまり、すべての配列) は、これらの非ジェネリック インターフェイスも実装します。

public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
于 2010-12-19T10:42:19.140 に答える
74

小さなコードスニペットを使用して、経験的に質問に対する答えを見つけることができます。

foreach (var type in (new int[0]).GetType().GetInterfaces())
    Console.WriteLine(type);

上記のスニペットを実行すると、次の出力(on .NET 4.0)が生成されます。

System.ICloneable
System.Collections.IList
System.Collections.ICollection
System.Collections.IEnumerable
System.Collections.IStructuralComparable
System.Collections.IStructuralEquatable
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]

`1意味<T>

.NET 4.5.NET Standard 1.0およびそれ以降)には、2つの追加インターフェイスがあります。

System.Collections.Generic.IReadOnlyList`1[System.Int32]
System.Collections.Generic.IReadOnlyCollection`1[System.Int32]
于 2010-12-19T11:18:00.033 に答える
57

.NET 4.5 以降、配列はインターフェイスSystem.Collections.Generic.IReadOnlyList<T>System.Collections.Generic.IReadOnlyCollection<T>.

したがって、.NET 4.5 を使用する場合、配列によって実装されるインターフェイスの完全なリストは次のようになります ( Hosam Aly の回答で提示された方法を使用して取得):

System.Collections.IList
System.Collections.ICollection
System.Collections.IEnumerable
System.Collections.IStructuralComparable
System.Collections.IStructuralEquatable
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]
System.Collections.Generic.IReadOnlyList`1[System.Int32]
System.Collections.Generic.IReadOnlyCollection`1[System.Int32]

奇妙なことに、 MSDN のドキュメントを更新して、これら 2 つのインターフェイスについて言及するのを忘れていたようです。

于 2013-08-04T11:24:13.120 に答える
1

配列インターフェイスで慎重に、それらを実装するかもしれませんが、実際には実際にはこれを行いません...次のコードを見てください。

            var x = new int[] { 1, 2, 3, 4, 5 };
        var y = x as IList<int>;
        Console.WriteLine("The IList:" + string.Join(",", y));
        try
        {
            y.RemoveAt(1);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        Console.WriteLine(string.Join(",", y));

次の出力が生成されます

したがって、解析は機能しますが、すべてがサポートされているわけではありません。これは、固定長コレクションの観点からは正しいですが、それがリストであると本当に信じている場合はまったく間違っています。SOLID :(.

迅速にテストするには、これが役立ちます。

于 2018-01-23T13:58:17.180 に答える
0

IList<T>, ICollection<T>, IEnumerable<T>配列のSZArrayHelperネストされたクラスでの実装を見つけました。

しかし、私はあなたに警告しなければなりません - そこにはもっと多くの質問があります...

リファレンス

その後、私は1つしか得られませんでした - there_is_no_array ;)

于 2018-04-03T14:59:18.770 に答える