我正在制作一个基类,它有一个virtual
名为“GetBaseAddresses()”的方法。它具有作为返回类型IEnumerable<Uri>
。如果枚举,基类将不会yield
有任何结果,但派生类可以选择覆盖该方法并返回任意数量的项目。
这是基本方法:
public virtual IEnumerable<Uri> GetBaseAddresses() { }
问题是,这不会编译。您必须返回一个值才能让编译器满意。所以,因为我想要一个空的结果,所以我会 return 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) { ... }”代码被完全编译掉了——编译器很高兴我满足了“必须返回一个值”的要求,并且完全按照我的意愿去做——也就是说,可以安全枚举的空结果集。
我的问题是 - 有没有办法在没有我的编译器技巧的情况下做到这一点?