26

非常に長い間、私は次のことに興味がありました。

int[] array = new int[1];
int iArrayLength = array.Length;    //1

配列はIListインターフェースを実装しているため、以下が許可されます。

int iArrayCount = ((IList<int>)array).Count;    //still 1

しかし:

int iArrayCount = array.Count;  //Compile error. WHY?
int iArrayLength = array.Length;    //This is what we learned at school!

質問:基本クラスでの使用を許可せずに、配列IList<T>(特にint Count { get; }からのプロパティ)を実装するにはどうすればよいですか?IList<T>

4

2 に答える 2

32

これは、明示的なインターフェイスメンバーの実装として知られています。インターフェイスメンバーは、そのタイプのパブリックメンバーとして公開されていませんが、インターフェイスタイプへの参照をキャストすることで利用できます。

これは、次のようにC#で実行できます。

interface I
{
    void M();
}

class C : I
{
    public int P { get; set; }
    void I.M() { Console.WriteLine("M!"); }
}

次に、次のようにこれらのタイプを使用できます。

C obj = new C();
obj.P = 3;
((I)obj).M();

しかし、これはコンパイルされません:

obj.M();

JeffN825が指摘しているように、インターフェイスメンバーを明示的に実装する理由の1つは、それらが型によってサポートされていないことです。たとえばAdd、例外をスローします(関連するディスカッション)。メンバーを明示的に実装するもう1つの理由は、別の名前の別のパブリックメンバーを複製することです。Countこれが、明示的に実装されている理由です。対応するパブリックメンバーは次のとおりですLength. 。最後に、一部のメンバー、つまりインデクサーが暗黙的に実装されます。これらの行は両方とも機能します(arrの配列であると仮定しますint):

arr[0] = 8;
((IList<int>)arr)[0] = 8;
于 2012-09-17T14:24:27.480 に答える
13

配列はIListのすべての機能(追加/削除など)をサポートしていないため、IList.Count(およびその他のいくつかのメソッド)はすべてプライベートに(明示的に)実装されます。あなたはこれを分解で見ることができます:

int ICollection.Count

あなたが本当にカウントを使いたいのなら、あなたはすることができます

((IList)myArray).Count
于 2012-09-17T14:24:08.087 に答える