1

重複の可能性:
IsReadOnlyがインターフェイスメンバーである場合、List <T>はどのようにしてIsReadOnlyをプライベートにしますか?

さて、これは私を狂わせています。List<T>を実装しIList<T>ます。でも、

IList<int> list = new List<int>();
bool b = list.IsReadOnly;
bool c = ((List<int>)list).IsReadOnly;    // Error

エラーは次のとおりです。

「System.Collections.Generic.List」には「IsReadOnly」の定義が含まれておらず、「System.Collections.Generic.List」タイプの最初の引数を受け入れる拡張メソッド「IsReadOnly」が見つかりませんでした(usingディレクティブがありませんか?またはアセンブリリファレンス?)

どうすればいいの?これは、メンバーを隠さないことについて、私たちがみんなに言うルールそのものに違反していませんか?ここでの実装の詳細は何ですか?

4

4 に答える 4

5

実装は明示的なインターフェイスの実装を介しているためです。

それが次のように定義されていることを意味します

bool IList<T>.IsReadOnly { get; set; //etc }

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

そしてそれがリストから外れていない理由です。

于 2011-09-23T04:51:28.413 に答える
1

List<T>は明示的に実装されるIList<T>ため、にアクセスする前にオブジェクトをインターフェイスにキャストする必要がありますIsReadOnly。MSDNから:

インターフェイスを実装するクラスは、そのインターフェイスのメンバーを明示的に実装できます。メンバーが明示的に実装されている場合、クラスインスタンスを介してアクセスすることはできず、インターフェイスのインスタンスを介してのみアクセスできます。

于 2011-09-23T04:53:15.623 に答える
0

Listクラスを見ると、次のことがわかります。

 bool IList.IsReadOnly { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        get; }

本当に関連するのは、IsReadOnlyが明示的な実装を使用して宣言されていることです。つまり、オブジェクトがIListのオブジェクトとして宣言されている場合にのみ、プロパティを表示できます。

于 2011-09-23T04:52:02.720 に答える
0

明示的なインターフェースの実装、次のようなもの:

bool IList<T>.IsReadOnly { get; }
于 2011-09-23T04:52:57.980 に答える