2016-04-22 97 views
1

在Visual Studio 2015年,當我去List.cs看類的聲明,我只看到一個名爲GetEnumerator的一個方法:列表的GetEnumerator返回類型不匹配接口

public Enumerator GetEnumerator(); 

在另一方面,接口IEnumerable的<牛逼>和IEnumerable規定,它必須定義方法,其格式爲:

IEnumerator<T> GetEnumerator(); 
IEnumerator GetEnumerator(); 

這讓我相信,接口方法可以實現即使reuturn類型不匹配excatly。雖然,當我嘗試時,結果是錯誤的。

這裏發生了什麼?

回答

0

如果你看看源,你會看到兩個不同的GetEnumerator方法:

public Enumerator GetEnumerator() { 
    return new Enumerator(this); 
} 

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

如果通過IEnumerator接口訪問對象的第二個時才使用。但是他們都使用相同的底層實現。

[Serializable] 
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator 
{ 
    ... 
} 

你仍然可以得到強類型版本如下:

var exampleList = new List<string>(); 
var enumerator1 = ((IEnumerable<string>)exampleList).GetEnumerator() 
var enumerator2 = (IEnumerable<string>) exampleList.GetEnumerator() 

對於enumerator1您是鑄造列表中使用的GetEnumerator()方法IEnumerable接口。對於enumerator2,您依賴的是每個中都使用相同的實現,因此您可以只投一次枚舉器。

+0

這是否意味着該類沒有實現,在元數據視圖中,我看不到GetEnumerator的顯式實現,因爲它是私有的? –

+0

您可以強制轉換以查看強類型實現。我將在上面編輯我的帖子,以便說清楚。 –

+0

謝謝,這很有幫助 –

0

該接口是明確實施的。你看到的方法不是接口實現,它是這個類的一個單獨的方法。