2013-05-25 58 views
1

我試圖創建一個實現IList的簡單類。但是,除非我第一次將DiskBackedCollection投射到IList,否則這些成員不可用。我如何在不投射的情況下使其可用?執行IList時成員不可用

public partial class DiskBackedCollection<T> : IList<T> 
{ 
    private List<T> _underlyingList = new List<T>(); 

    int IList<T>.IndexOf(T item) 
    { 
     return _underlyingList.IndexOf(item); 
    } 

    T IList<T>.this[int index] 
    { 
     get 
     { 
      return _underlyingList[index]; 
      throw new NotImplementedException(); 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    int ICollection<T>.Count 
    { 
     get 
     { 
      return _underlyingList.Count; 
     } 
    } 

    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     return new DiskBackedCollectionEnumerator(this); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return new DiskBackedCollectionEnumerator(this); 
    } 
} 
+3

[C#接口。隱式實現與顯式實現](http://stackoverflow.com/questions/143405/c-sharp-interfaces-implicit-implementation-versus-explicit-implementation)。 – poke

+0

我設法進入我的腦海,這只是一個代碼清晰的事情! - 感謝您的鏈接。 – Lee

+0

與您的問題無關,但它通常會簡化您的代碼以使用基類「Collection 」,它具有虛擬方法「InsertItem」,「RemoveItem」等,您可以覆蓋任何自定義功能。 – Joe

回答

2

這是因爲每個成員在他們面前都有IList<T>.。刪除,他們應該出現。

在接口成員前面實施IList<T>.稱爲explicit implementation

+1

並添加公共:) :) – DaveShaw

+0

哈哈,確實:) –

+0

@DaveShaw編譯器應該抱怨,如果你沒有公開實現一個接口(在這種情況下,你在技術上不會實現它)。 – poke

0

實現接口要求的方法必須是公開的。你的不是。

此外,您還需要刪除您明確執行:

public int Count 
{ 
    get 
    { 
    return _underlyingList.Count; 
    } 
}