3

System.Arrayクラスはインターフェイスを実装しますICollectionCountこのインターフェイスには、配列内の要素の数を指定するというパブリック プロパティがあります。

Array を宣言し、そのプロパティにアクセスするとします。

Array numbers = Array.CreateInstance(typeof(int), 10);
Console.WriteLine(numbers.Count);

画面には 10 が表示されるはずです。しかし、Count数字の後にピリオドを入れると、プロパティが表示されません。ただし、 というプロパティがありますLength。なぜそうなのですか?

更新: これは、明示的なインターフェイスの実装によるものです。私と似たような質問が他にもあったので、言い直すことにしました。この特定のプロパティを明示的に実装するという設計上の決定が行われたのはなぜですか? 同じ機能を持つ別のプロパティがありますLength。では、なぜ明示的に実装された を提供するという手間がかかるのCountでしょうか?

4

4 に答える 4

4

にキャストする必要がありますICollection

Array.ICollection.Count財産

このメンバーは、明示的なインターフェイスメンバーの実装です。ArrayインスタンスがICollection インターフェイスにキャストされている場合にのみ使用できます。

ところで、ここに重複があります:配列のCountプロパティにアクセスすることはできませんが、ICollectionにキャストすることによってアクセスできます!

更新

これは、明示的なインターフェイスの実装によるものです。私と同じような質問があるので、言い換えることにしました。この特定のプロパティを明示的に実装するために設計上の決定が行われたのはなぜですか?同じ機能の長さを持つ別のプロパティがあります。では、なぜ明示的に実装されたカウントを提供するのに苦労するのでしょうか?

それはそれを継承し、そこからIList<T>を実装しICollection<T>ます。したがって、代わりに、配列が実装される理由IListを尋ねることができますか?

于 2013-02-20T09:38:29.597 に答える
2

System.ArrayクラスはICollection明示的にインターフェースを実装します。ICollectionにキャストArrayした後にのみのメソッドを使用できますICollection

Array numbers = Array.CreateInstance(typeof(int), 10);
ICollection numbersCollection =  (ICollection)numbers;
Console.WriteLine(numbersCollection.Count);

暗黙的および明示的なインターフェイスの実装

System.Array.Count実際にArray.Lengthプロパティを使用します

int ICollection.Count
{
    get
    {
        return this.Length;
    }
}
于 2013-02-20T09:39:36.007 に答える
1

これはプログラミングの問題ではなく、論理的意図の問題だと思います

次の 2 つの質問を自問してみてください。

Q1 . 配列はコレクションですか?

Q2 . コレクションは配列ですか?

C# の既存の実装では、Q1 の答えは次のようになります。

A1 : はい、配列はコレクションです。したがってArray、実装しICollectionます。

Q2はどうですか?馬は白い馬ですか?答えは「白馬が馬じゃないとき」を見てみるといいかもしれません。

Q2 については、「わかりません。文脈によると思います」と答えます。 では、考えられるコンテキストは何ですか?インターフェイスのimplementsとして配列を渡した場合ICollection、はい、このコレクションも配列です。ただし、同じインターフェイスを持つ配列以外の別のオブジェクトを渡す場合があります。では、それは必ずしも配列でしたか? これを拡張することに興味がある場合は、[この回答] の A3 からアイデアが得られるかもしれません。

したがって、それは完全に合理的Arrayあり、 のプロパティを持ち、また の明示的な実装からLengthのプロパティも持っています。CountICollection

于 2013-02-20T12:09:25.120 に答える
1

Countインターフェイスから明示的に実装されICollectionます。それが目に見えない理由です。((ICollection) numbers).Countプロパティにアクセスするには、キャストする必要がありCountます。

于 2013-02-20T09:36:43.137 に答える