Можем ли мы использовать GetEnumerator () без использования интерфейса Ienumerable?
-
04-10-2019 - |
Вопрос
У меня есть класс, называемый простыми простыми, и этот класс реализует GetEnumerator () без реализации интерфейса IENumerable.
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
Я не понимаю. Я что-то пропустил?
Решение
Во-первых, как и другие, вы можете представить свои собственные методы без реализации интерфейсов в любом случае - вы можете написать свой собственный Dispose
метод без реализации IDisposable
И т.д. Для известных интерфейсов я предложил, это почти плохая идея (поскольку читатели будут иметь определенные ожидания), но это совершенно действует.
Что еще главное, foreach
Заявление в C # могу работать без работы IEnumerable
быть вовлеченным. Компилятор эффективно ли утка с компиляцией, набрав на имена GetEnumerator()
, Current
а также MoveNext()
. Отказ Это было в первую очередь, чтобы позволить сильно набрать (и не боксерскую) итерацию в C # 1, перед универсальными. См. Раздел 8.8.4 спецификации C # 3 для более подробной информации.
Тем не менее, это вообще плохое представление о том, чтобы сделать это сейчас, если вы делать Хотите иметь возможность легко повторять содержание экземпляра как коллекции - и действительно, я предложил реализовать IEnumerable<T>
вместо всего IEnumerable
.
Другие советы
Да, ты можешь. Даже вы можете использовать его в foreach
. Отказ Единственная проблема, которую объекты этого класса не могут быть брошены IEnumerable
Хотя они реализуют необходимый метод.
Нет никаких причин, которые вы должны реализовать IEnumerable
Для того, чтобы создать функцию под названием GetEnumerator
Это возвращает А.Н. IEnumerator
, это просто означает, что вы не сможете поставлять экземпляр этого типа на что-то, что ожидает IEnumerable
.
Интерфейс обеспечивает контракт, который не означает, что у вас нет метода с той же подписью, что и один в интерфейсе на классе, который не представляет собой интерфейс.