@dtbが指摘する明示的なインターフェイス実装です。これは、これは、明示的なインタフェースの実装のパワーであるタイプList
var l = new List<int>();
// compiler error
var sr1 = l.SyncRoot;
ICollection c = l;
// works
var sr2 = c.SyncRoot;
の参考文献からタイプICollection
の基準からではなく、使用した場合メンバーSyncRoot
が表示されていることを意味します。何らかの理由でインタフェース参照の基本動作を定義したいが、クラス参照の特殊な振る舞い(より具体的になるように戻り値の型を変更する(普通は過負荷では有効でない)など)を定義したい場合は、この。または、レガシー目的のためのインターフェイスを実装するが、実装ではもはや役に立たないメソッドやプロパティを隠したい場合。 、
object ICollection.SyncRoot
{
...
}
だから、これはList<T>
オブジェクトへのICollection
参照を通じてICollection
インタフェース用SyncRoot
、それが見えるように実装されています。あなたが逆コンパイルコードを見れば
したがって、次のような宣言が表示されますList<T>
オブジェクトへの他の参照(非ICollection
)のためにそれを隠します。
これは、IEnumerable
のようなレガシーインターフェイスで作業する場合にも非常に便利です。たとえば、IEnumerable<T>
をサポートする場合は、IEnumerable
もサポートする必要がありますが、どちらも返品タイプによって異なるGetEnumerator()
メソッドがあります。例えば:私たちは異なる値を返すが、同じシグネチャを持つ2つのメソッド(オーバーロード)を持つことができませんので
public class MySpecialList<T> : IEnumerable<T>
{
// if we access from any other reference, we get the new, generic
// interface
public IEnumerator<T> GetEnumerator()
{
// your actual implementation
}
// so if we access from a reference of IEnumerable, we get older,
// non-generic interface
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
、我々はIEnumerable
従来の参照で使用された場合GetEnumerator()
は一つのことを意味するクラスを教えてくれ、と何かすることができます他のすべての参照のための全く異なる(より良い):
var x = new MySpecialList<int>();
IEnumerable y = x;
// returns the generic enumerator
var genericEnum = x.GetEnumerator();
// since called from an IEnumerable, gets legacy enumerator
var legacyEnum = y.GetEnumerator();
http://stackoverflow.com/questions/143405/c-interfaces-implicit-and-explicit-implementation – dtb
シャーク、あなたは何を意味するのですか? 0%はどういう意味ですか? – user829174
10の質問をした後、0%の受諾は非常に貧弱な形式です。あなたの前の質問のいくつかを再訪問し、よく書かれているか役立つと思われる回答の横にある「目盛り」をクリックしてください。 – ColinE