2016-04-22 95 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

该接口是明确实施的。你看到的方法不是接口实现,它是这个类的一个单独的方法。