IEnumerable <int> Требуется также не общий IEnumerator?

3 вопроса:

1) почему вывод out берется из общей функции NON?

2) почему у меня есть, чтобы реализовать ТАКЖЕ НЕТ общую функцию?

3) Что мне нужно сделать, если я хочу увидеть вывод функции Generic (int)?

enter image description here

Ответ 1

  • Ключевое слово foreach не требует, чтобы коллекция реализовала IEnumerable вообще; скорее, он будет вызывать любые определенные методы GetEnumerator.

  • IEnumerable<T> реализует IEnumerable по соображениям совместимости.

  • Вы должны явно реализовать IEnumerable.GetEnumerator() и вернуть нормальный метод IEnumerator<T>.

Если класс имеет обычный метод GetEnumerator() (в отличие от явной реализации интерфейса), компилятор его вызовет.
Спектр говорит:

  • В противном случае определите, имеет ли тип X соответствующий метод GetEnumerator:
    • Выполните поиск элемента по типу X с идентификатором GetEnumerator и без аргументов типа. Если поиск элемента не приводит к совпадению, или он создает двусмысленность или создает совпадение, которое не является методом group, проверьте перечислимый интерфейс, как описано ниже. это рекомендуется выдавать предупреждение, если ничего, кроме группы методов или нет.
    • Выполните разрешение перегрузки с помощью полученной группы методов и пустого списка аргументов. Если разрешение перегрузки не приводит к применимые методы, приводит к двусмысленности или приводит к лучший метод, но этот метод является либо статическим, либо не открытым, проверьте перечислимый интерфейс, как описано ниже. Рекомендуется, чтобы предупреждение, если разрешение перегрузки создает что-либо, кроме однозначный метод публичных экземпляров или неприменимые методы.
    • [...]
  • В противном случае проверьте перечислимый интерфейс:

Ответ 2

1) Результат выводится из не общей функции, потому что он определен неявно (и общая функция определена явно).

2) IEnumerable<T> наследуется от IEnumerable, поэтому любой тип, наследующий от IEnumerable<T>, также должен реализовывать элементы IEnumerable

3) Сделать общее определение неявным, а не общее определение - явным, например

public class Class1 : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        yield return 1;
        yield return 2;
        yield return 3;
        yield return 4;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

Обратите внимание, что вы можете вернуть общий счетчик из не-общего метода, потому что IEnumerator<T> наследует от IEnumerator.

Ответ 3

Вам нужно реализовать оба варианта, поскольку IEnumerable<T> выводится из IEnumerable. Чтобы вызвать явно реализованный метод, вам необходимо передать его в этот интерфейс.

Но обычно вы реализуете не общий метод явно и общий метод неявно. Таким образом foreach будет использовать общий метод. foreach использует метод GetEnumerator() для типа коллекции и возвращается к методам интерфейса, если этот метод отсутствует.

Типичная реализация:

public IEnumerator<int> GetEnumerator()
{
   ...
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
  return GetEnumerator();//Forward to strongly typed version
}