#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(); // это тоже не вызовет ошибки
Комментариев нет:
Отправить комментарий