2010-11-08 44 views
6

ReadOnlyCollection<T>實現ICollection<T>接口,它具有Add和Remove之類的方法。我知道如何使用屬性來隱藏Intellisense中的方法,但是如果我嘗試使用這些方法,怎麼會導致實際的編譯錯誤呢? (順便說一句,我知道在ROC上調用Add和Remove是沒有意義的,但這是一個關於導致繼承的memebers編譯錯誤,而不是使用正確的數據結構的問題)。ReadOnlyCollection如何隱藏添加和刪除方法

回答

16

他們與explicit interface implementation實現的,就像這樣:

void ICollection<T>.Add(T item) { 
    throw NotSupportedException(); 
} 

的方法仍然是可調用的,但是隻有當你查看的對象爲ICollection<T>。例如:

ReadOnlyCollection<int> roc = new ReadOnlyCollection<int>(new[] { 1, 2, 3 }); 
// Invalid 
// roc.Add(10); 

ICollection<int> collection = roc; 
collection.Add(10); // Valid at compile time, but will throw an exception 
2

事實上,通過實現從ICollection<T>接口明確這些方法,你不能直接給他們打電話。
您必須明確地將對象(ReadOnlyCollection實例)轉換爲ICollection<T>。然後,您可以調用Add方法。 (因此,編譯器不會抱怨,雖然你會得到一個運行時異常)。