11

重複の可能性:
コレクション内のカウントvs長さvsサイズ

本当に奇妙な:

次のようなC#配列

double[] test = new double[1];

配列のサイズを取得するためのLengthプロパティをサポートします。ただし、配列はIListインターフェイスも実装しています。

IList<double> list = test;

ただし、IListインターフェイスはCountプロパティも提供します。なぜアレイ(この場合は「テスト」)が機能しないのですか?

編集:Countプロパティを提供するのは実際にはICollectionインターフェイス(IListではない)であり、これはインターフェイスの明示的な実装によるものであると指摘してくれたすべての人に感謝します。

4

4 に答える 4

18

単純に、彼らはそれを呼び出し、明示的なインターフェース実装を介して実装することを選択しました-次のようなものですLengthCount

int ICollection.Count { get { return Length; } }
于 2011-01-22T19:16:46.030 に答える
9

これは、セマンティクスではなく、ネーミングに関する設計上の選択でした。

文字列と同様に、配列にはLengthプロパティがあります。

長さ信号は不変です:配列に追加したり、配列から削除したりすることはできません。

リストやその他のコンテナには、通常は変更できるCountプロパティがあります。

ああ、あなたが電話 list.Append(1.1);をすると、サポートされていない例外が発生します。

于 2011-01-22T19:16:39.687 に答える
5

プロパティは、明示的なインターフェイス宣言スタイルを使用して非表示になります。Countたとえば、クラス定義では次のようになります。

int IList.Count {
    get {
        // ...etc...
    }
}

型キャストを使用して、このように非表示になっているメソッドとプロパティにアクセスできます。

((IList<double>) myArray).Count
于 2011-01-22T19:18:46.510 に答える
4

実行時にArray 実装を取得するIList<T>ことから継承する型(これがどのように可能であるか、私に聞かないでください):

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

マークが彼の答えで説明したように、事実上、IList<T>実装は明示的な実装のように機能します。これが、キャストの結果からの特定のメンバーにアクセスできるが、具体的に入力された変数からはアクセスできない理由です。IList<T>T[]

于 2011-01-22T19:17:18.303 に答える