Я создаю базовый класс с виртуальным методом 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