【发布时间】:2012-06-13 22:02:04
【问题描述】:
我正在创建一个基类,它有一个名为“GetBaseAddresses()”的virtual 方法。它有一个返回类型IEnumerable<Uri>。如果枚举,基类不会yield 任何结果,但派生类可以选择覆盖该方法并返回任意数量的项。
这是基本方法:
public virtual IEnumerable<Uri> GetBaseAddresses() { }
问题是,它不会编译。您必须返回一个值,让编译器满意。所以,因为我想得到一个空的结果,我会直接返回null,对吧?
public virtual IEnumerable<Uri> GetBaseAddresses() { return null; }
问题在于,如果有人对基类的实例执行foreach,他们将崩溃并出现“未设置对象引用...”的运行时错误
所以,回想一下 yield return 关键字对 C# 编译器有一些魔力...我想出了这个编译器技巧(顺便说一句)。
public virtual IEnumerable<Uri> GetBaseAddresses()
{
if (false) { yield return new Uri(""); }
}
奇怪的是,即使“if (false) { ... }”代码被完全编译掉了——编译器很高兴我满足了“必须返回一个值”的要求,并且完全按照我的意愿去做——是一个可以安全枚举的空结果集。
我的问题是 - 有没有办法在没有我的编译器技巧的情况下做到这一点?
【问题讨论】:
-
为什么不使用抽象基类和方法?
-
因为大多数类都有功能......只有几个方法是
virtual。
标签: c# compiler-construction virtual ienumerable yield-return