Можем ли мы использовать GetEnumerator () без использования интерфейса IEnumerable? - PullRequest
2 голосов
/ 25 мая 2010

У меня есть класс Primes, и этот класс реализует GetEnumerator () без реализации интерфейса IEnumerable.

public class Primes
{
    private long min;
    private long max;

    public Primes()
        : this(2, 100)
    {
    }

    public IEnumerator GetEnumerator()
    {...}

Я не понимаю. Я что-то упустил?

Ответы [ 4 ]

8 голосов
/ 25 мая 2010

Во-первых, как уже говорили другие, вы можете в любом случае представить свои собственные методы без реализации интерфейсов - вы можете написать собственный метод Dispose без реализации IDisposable и т. Д. Для хорошо известных интерфейсов я бы сказал, что это почти плохо идея (поскольку у читателей будут определенные ожидания), но она полностью верна.

Что еще более важно, оператор foreach в C # может работать без участия IEnumerable. Компилятор эффективно выполняет утку во время компиляции на именах GetEnumerator(), Current и MoveNext(). Это было сделано прежде всего для того, чтобы разрешить строго типизированную (и не боксерскую) итерацию в C # 1, перед генериками. См. Раздел 8.8.4 спецификации C # 3 для получения более подробной информации.

Однако, как правило, это плохая идея сделать это сейчас, если вы делаете хотите иметь возможность легко перебирать содержимое экземпляра как коллекции - и действительно, я бы предложил реализовать IEnumerable<T> вместо просто IEnumerable.

1 голос
/ 25 мая 2010

Нет причины, по которой вам нужно реализовать IEnumerable, чтобы создать функцию с именем GetEnumerator, которая возвращает IEnumerator, это просто означает, что вы не сможете передать экземпляр этого типа чему-либо который ожидает IEnumerable.

1 голос
/ 25 мая 2010

да, вы можете. даже вы можете использовать его в foreach. Единственная проблема в том, что объекты этого класса нельзя привести к IEnumerable, хотя они реализуют необходимый метод.

0 голосов
/ 25 мая 2010

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

...