3 вопроса:
1) почему вывод out берется из общей функции NON?
2) почему у меня есть, чтобы реализовать ТАКЖЕ НЕТ общую функцию?
3) Что мне нужно сделать, если я хочу увидеть вывод функции Generic (int)?
3 вопроса:
1) почему вывод out берется из общей функции NON?
2) почему у меня есть, чтобы реализовать ТАКЖЕ НЕТ общую функцию?
3) Что мне нужно сделать, если я хочу увидеть вывод функции Generic (int)?
Ключевое слово foreach
не требует, чтобы коллекция реализовала IEnumerable
вообще; скорее, он будет вызывать любые определенные методы GetEnumerator
.
IEnumerable<T>
реализует IEnumerable
по соображениям совместимости.
Вы должны явно реализовать IEnumerable.GetEnumerator()
и вернуть нормальный метод IEnumerator<T>
.
Если класс имеет обычный метод GetEnumerator()
(в отличие от явной реализации интерфейса), компилятор его вызовет.
Спектр говорит:
- В противном случае определите, имеет ли тип X соответствующий метод GetEnumerator:
- Выполните поиск элемента по типу X с идентификатором GetEnumerator и без аргументов типа. Если поиск элемента не приводит к совпадению, или он создает двусмысленность или создает совпадение, которое не является методом group, проверьте перечислимый интерфейс, как описано ниже. это рекомендуется выдавать предупреждение, если ничего, кроме группы методов или нет.
- Выполните разрешение перегрузки с помощью полученной группы методов и пустого списка аргументов. Если разрешение перегрузки не приводит к применимые методы, приводит к двусмысленности или приводит к лучший метод, но этот метод является либо статическим, либо не открытым, проверьте перечислимый интерфейс, как описано ниже. Рекомендуется, чтобы предупреждение, если разрешение перегрузки создает что-либо, кроме однозначный метод публичных экземпляров или неприменимые методы.
- [...]
- В противном случае проверьте перечислимый интерфейс:
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
.
Вам нужно реализовать оба варианта, поскольку IEnumerable<T>
выводится из IEnumerable
. Чтобы вызвать явно реализованный метод, вам необходимо передать его в этот интерфейс.
Но обычно вы реализуете не общий метод явно и общий метод неявно. Таким образом foreach
будет использовать общий метод. foreach
использует метод GetEnumerator()
для типа коллекции и возвращается к методам интерфейса, если этот метод отсутствует.
Типичная реализация:
public IEnumerator<int> GetEnumerator()
{
...
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();//Forward to strongly typed version
}