我認爲這是非常愚蠢的,和我有點不好意思問這樣的問題,但我還是沒能找到答案:列表<T>如何實現添加(對象值)?
我期待在類List<T>
,其中implemetns IList
。
public class List<T> : IList
包括在ILIST的方法之一是
int Add(object value)
我的理解是List<T>
不應該讓這種方法(類型安全......),它確實不是。但它怎麼會呢? mustnt類實現整個接口?
我認爲這是非常愚蠢的,和我有點不好意思問這樣的問題,但我還是沒能找到答案:列表<T>如何實現添加(對象值)?
我期待在類List<T>
,其中implemetns IList
。
public class List<T> : IList
包括在ILIST的方法之一是
int Add(object value)
我的理解是List<T>
不應該讓這種方法(類型安全......),它確實不是。但它怎麼會呢? mustnt類實現整個接口?
我認爲,這(接口)的方法是implemented explicitly:
public class List<T> : IList
{
int IList.Add(object value) {this.Add((T)value);}
}
通過這樣做,Add(object)
方法將被隱藏。如果您將List<T>
實例重新轉換回IList
實例,則只能調用它。
List<T>
明確實施IList.Add(object value)
這就是爲什麼它通常不可見。您可以通過執行以下測試:
IList list = new List<string>();
list.Add(new SqlDataReader()); // valid at compile time, will fail at runtime
它明確地實現它,所以你必須強制轉換爲IList
首先使用它。
List<int> l = new List<int>();
IList il = (IList)l;
il.Add(something);
你可以把它先鑄造列表實例的接口:
List<int> lst = new List<int>();
((IList)lst).Add("banana");
,你會得到的那樣好,運行時間,ArgumentException的。
快速去反射顯示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);
}
換句話說,執行它轉換到牛逼,使其工作和失敗,你傳遞一個非牛逼兼容型。
Frederik is right是List<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
的記錄要求,我懷疑它接近真實的東西。
我不確定你的意思是不暴露它,接口只能有公共成員。 – 2010-12-08 14:51:36
@Brad:`列表`不是一個接口,他在說`List `不應該暴露它。 –
2010-12-08 14:52:16
它被稱爲「顯式接口實現」。 – codymanix 2010-12-08 14:53:14