Почему изменение типа на динамическое приводит к тому, что мой код C # вызывает исключение? - PullRequest
2 голосов
/ 10 ноября 2010

Следующая программа на C # делает то, что я ожидаю: выводить «First», «Second», «Third».Однако, когда я изменяю тип foo в Main на динамический, возникает исключение, которое говорит:

"Не удается неявно преобразовать тип« MyProgram.Program »в« System.Collections.IEnumerable ». Существует явное преобразование(вам не хватает приведения?) "

Почему изменение типа на динамическое нарушает код таким образом?

Спасибо!

using System;

namespace TestForEach
{
class Program
{
    private int idx = -1;
    public Program GetEnumerator() {
        return this;
    }
    public string Current
    {
        get {
            string[] arr = { "First", "Second", "Third" };
            return arr[idx];
        }
    }

    public Boolean MoveNext()
    {
        return ++idx < 3;
    }

    static void Main(string[] args)
    {
        Program foo = new Program();
        foreach (var i in foo)
        {
            System.Console.WriteLine(i);
        }
        System.Console.ReadKey();
    }
}
}

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Мне кажется, это потому, что ваш Program реализует соответствующие методы, чтобы компилятор считал его итератором.

Итератор вызывается из клиентского кода с помощью оператора foreach. Например, вы можете создать итератор для класса, который возвращает элементы в обратном порядке, или который выполняет операцию с каждым элементом до того, как итератор возвращает его. Когда вы создаете итератор для вашего класса или структуры, вам не нужно реализовывать весь интерфейс IEnumerator. Когда компилятор обнаружит ваш итератор, он автоматически сгенерирует методы Current, MoveNext и Dispose интерфейса IEnumerator или IEnumerator (Of T).

При использовании динамического ключевого слова компилятор не может обнаружить, что Program используется в итерируемом контексте. Из-за этого он не генерирует соответствующий код для использования в цикле foreach.

0 голосов
/ 10 ноября 2010

Я удивлен, что даже компилируется.Класс Program должен реализовывать IEnumerable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...