Виртуальный IEnumerable, который компилируется пустымC#

Место общения программистов C#
Ответить
Anonymous
 Виртуальный IEnumerable, который компилируется пустым

Сообщение Anonymous »

Я создаю базовый класс с виртуальным методом GetBaseAddresses(). Он имеет тип возвращаемого значения IEnumerable. Базовый класс не даст никаких результатов при перечислении, но производный класс имеет возможность переопределить метод и вернуть столько элементов, сколько захочет.

Вот базовый метод:

Код: Выделить всё

public virtual IEnumerable GetBaseAddresses() { }
Проблема в том, что это не скомпилируется. Вы должны вернуть значение, чтобы компилятор был доволен. Итак, поскольку я хочу получить пустой результат, я бы просто вернул ноль, верно?

Код: Выделить всё

public virtual IEnumerable GetBaseAddresses() { return null; }
Проблема в том, что если кто-то выполнит foreach для экземпляра базового класса, произойдет сбой с ошибкой времени выполнения «Ссылка на объект не установлена». ..."

Итак, вспомнив, что ключевое слово доходность return творит чудеса с компилятором C#... Я придумал этот хак компилятора (который кстати работает).

Код: Выделить всё

public virtual IEnumerable GetBaseAddresses()
{
if (false) { yield return new Uri(""); }
}
Как ни странно, хотя код «if (false) { ... }» полностью компилируется, компилятор доволен тем, что я встречаю условие «должен вернуть value» и делает именно то, что я хочу, то есть пустой набор результатов, который можно безопасно перечислять.

Мой вопрос: есть ли способ сделать это без моего трюка с компилятором?

Подробнее здесь: https://stackoverflow.com/questions/110 ... iles-empty
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»