2012-01-04 16 views
4

インターフェイスにメソッド、デリゲート、またはイベントのシグネチャのみが含まれていることに慣れています。メソッドの実装は、インタフェースを実装するクラスで行われます。インタフェースを実装するクラスはそのメソッドを実装しなければならない(MUST)。ICollection実装とインターフェイスの理解

一般的なリストを作成しました。 Listの宣言を参照すると、ICollectionを継承していることがわかります。ICollectionには、以下のシグネチャメソッドがあります。Object SyncRoot {get; } リストクラスのSyncRoot実装が表示されないのはなぜですか?

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, 
         IList, ICollection, IEnumerable 
{ 
    public List(); 
    public List(IEnumerable<T> collection); 
    public List(int capacity); 
} 

私は期待しています:public object syncRoot()上記の?また、JustDecompile(Telerik)で開くと、実装されていますが、privateと表示されています。私は何かが欠けていますか?

+4

http://stackoverflow.com/questions/143405/c-interfaces-implicit-and-explicit-implementation – dtb

+0

シャーク、あなたは何を意味するのですか? 0%はどういう意味ですか? – user829174

+3

10の質問をした後、0%の受諾は非常に貧弱な形式です。あなたの前の質問のいくつかを再訪問し、よく書かれているか役立つと思われる回答の横にある「目盛り」をクリックしてください。 – ColinE

答えて

6

@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(); 
+0

これは私が知っている、なぜ私はリストのそれの実装を見ていないのですか?結局のところ リストはICollectionを継承していますので、クラスリスト(F12)に表示されます。 – user829174

+1

@ user829174:プライベートなのでそれは 'ICollection'リファレンス –

+0

@ user829174を通してのみ見えますが、あなたはどこを探していますか? – nos

関連する問題