2016-04-22 5 views
1

В Visual Studio 2015, когда я иду в List.cs и увидеть объявление класса, я вижу только один метод с именем GetEnumerator:Список GetEnumerator возвращаемый тип не соответствует интерфейс

public Enumerator GetEnumerator(); 

С другой стороны, интерфейс IEnumerable <T> и IEnumerable указывает, что он должен определить метод, формат которого является:

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

Это заставило меня поверить, что метод интерфейса может быть реализован, даже если тип reuturn не совпадают все тоже. Хотя, когда я пытался, это оказалось неправильным.

Что здесь происходит?

ответ

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

Интерфейс реализован явно. Метод, который вы видите, не является реализацией интерфейса, это отдельный метод для класса.

Смежные вопросы