Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

C# вопрос по преобразованию

#c_sharp #ienumerable


Есть класс, реализующий интерфейс IEnumerable

class MyClass : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        for(int i = 0; i < 100; i++)
        {
            yield return i;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)this).GetEnumerator(); //всё хорошо
        return (IEnumerable)this.GetEnumerator(); //error;
    }


Почему первый вариант компилятор принимает, а второй подчеркивает, что такая запись
недопустима, если, по идеи, оба эти записи являются операциями преобразования?
    


Ответы

Ответ 1



Потому что он думает, что Вы хотите переменную типа IEnumerable преобразовать в IEnumerator. То есть расценивает это как попытку вызвать this.GetEnumerator(), преобразовать реультат в IEnumerable (явным кастом) и вернуть как IEnumerator (неявным кастом) - тип возвращаемого значения, объявленный в декларации метода. Просто: return this.GetEnumerator();

Ответ 2



В первом случае вы приводите к типу IEnumerable свой this: return ((IEnumerable)this).GetEnumerator(); Во втором случае вы приводите к типу IEnumerable результат this.GetEnumenator() return (IEnumerable)this.GetEnumenator(); Поэтому и ошибка. А вообще, вы можете тут написать вот так: return GetEnumerator(); // это тоже не вызовет ошибки

Комментариев нет:

Отправить комментарий