Можем ли мы использовать GetEnumerator () без использования интерфейса Ienumerable?

StackOverflow https://stackoverflow.com/questions/2905737

  •  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.

Интерфейс обеспечивает контракт, который не означает, что у вас нет метода с той же подписью, что и один в интерфейсе на классе, который не представляет собой интерфейс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top