2011-09-23 71 views
1

可能重複:
How does List<T> make IsReadOnly private when IsReadOnly is an interface member?C#列表<T>隱藏屬性?

好了,這是推動我堅果。 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」和沒有擴展方法的定義「IsReadOnly」接受類型的第一個參數'System.Collections.Generic.List'可以找到(你是否缺少使用指令或程序集引用?)

這怎麼可能?這是否違反了我們告訴大家的關於不隱藏成員的規則?這裏的實現細節是什麼?

+0

要進入細節它能夠更好地利用反射的 –

回答

0

如果你看一下List類,你會看到這一點:

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

所有這一切的真正相關的是,IsReadOnly使用明確的執行,這意味着,如果對象是屬性只能看到聲明宣稱爲IList。

0

顯式接口實現,是這樣的:

bool IList<T>.IsReadOnly { get; } 
1

List<T>工具IList<T>明確的,所以你必須能夠訪問IsReadOnly前的對象強制轉換爲接口。從MSDN:

實現接口的類可以顯式實現該接口的成員 。當一個成員被顯式實現,它不能被 通過一個類的實例訪問,但只能通過 接口實例