2010-12-08 55 views
5

我認爲這是非常愚蠢的,和我有點不好意思問這樣的問題,但我還是沒能找到答案:列表<T>如何實現添加(對象值)?

我期待在類List<T>,其中implemetns IList

public class List<T> : IList 

包括在ILIST的方法之一是

int Add(object value) 

我的理解是List<T>不應該讓這種方法(類型安全......),它確實不是。但它怎麼會呢? mustnt類實現整個接口?

+0

我不確定你的意思是不暴露它,接口只能有公共成員。 – 2010-12-08 14:51:36

+0

@Brad:`列表`不是一個接口,他在說`List `不應該暴露它。 – 2010-12-08 14:52:16

+0

它被稱爲「顯式接口實現」。 – codymanix 2010-12-08 14:53:14

回答

10

我認爲,這(接口)的方法是implemented explicitly

public class List<T> : IList 
{ 
    int IList.Add(object value) {this.Add((T)value);} 
} 

通過這樣做,Add(object)方法將被隱藏。如果您將List<T>實例重新轉換回IList實例,則只能調用它。

2

List<T>明確實施IList.Add(object value)這就是爲什麼它通常不可見。您可以通過執行以下測試:

IList list = new List<string>(); 
list.Add(new SqlDataReader()); // valid at compile time, will fail at runtime 
1

它明確地實現它,所以你必須強制轉換爲IList首先使用它。

List<int> l = new List<int>(); 
IList il = (IList)l; 
il.Add(something); 
1

你可以把它先鑄造列表實例的接口:

List<int> lst = new List<int>(); 
((IList)lst).Add("banana"); 

,你會得到的那樣好,運行時間,ArgumentException的。

2

快速去反射顯示IList.Add實現這樣的:

int IList.Add(object item) 
{ 
    ThrowHelper.IfNullAndNullsAreIllegalThenThrow<T>(item, ExceptionArgument.item); 
    try 
    { 
     this.Add((T) item); 
    } 
    catch (InvalidCastException) 
    { 
     ThrowHelper.ThrowWrongValueTypeArgumentException(item, typeof(T)); 
    } 
    return (this.Count - 1); 
} 

換句話說,執行它轉換到牛逼,使其工作和失敗,你傳遞一個非牛逼兼容型。

1

Frederik is rightList<T>的實施IList是明確的某些成員,特別是那些威脅到類型安全。

他在答案中提出的實現方式當然是不正確的,因爲它不會編譯。

在這種情況下,典型的做法是努力嘗試讓接口成員工作,但放棄,如果它是不可能的。該方法IList.Add定義爲返回

注:

到其中的新 元件插入,或-1至 指示該項目未被 插入到集合中的位置。

所以,事實上,一個全面實施可能:

int IList.Add(object value) 
{ 
    if (value is T) 
    { 
     Add((T)value); 
     return Count - 1; 
    } 

    return -1; 
} 

這只是一個猜測,當然。 (如果你確實想知道,你總是可以使用Reflector。)它可能稍有不同;例如它可能會拋出一個NotSupportedException,這通常是由於不完整的接口實現,如ReadOnlyCollection<T>的實現IList<T>。但由於上述內容符合IList.Add的記錄要求,我懷疑它接近真實的東西。

相關問題