好吧,我需要一些.Net高手告诉我为什么下面代码中的异常只有在枚举返回值时才会抛出。
public IEnumerable<string> BuildFor(Environment environment)
{
if (environment == Environment.None)
{
throw new Exception($"Impossible to build for environment '{environment}'.");
}
string clientId = ClientIds.Api[environment];
foreach (string scope in scopes)
{
yield return $"api://{clientId}/{scope}";
}
}
好的,更正:我需要确认正在发生的事情。证据告诉我整个方法调用都被推迟了,我认为这很可能是编译器优化。
后续问题:我怎样才能告诉编译器停止这样做?
如果你不想惰性求值,只需以“传统”方式编写方法即可,即
或者您可以确保评估在现场进行,如下所示:
编译器与它无关。
一种选择是使实际的迭代器成为从引发异常的方法中调用的私有方法。
foreach
以下代码与您的代码非常相似,并且在进入方法中的第二个循环之前不会引发异常Main
:就迭代而言,这种变体的工作方式相同,但它会在第二次
GetItems
调用时抛出,而不等待枚举:正如评论中所建议的,如果您的 C# 版本支持它,您可以使用本地方法而不是私有成员方法。它基本上只是将私有方法移动到公共方法中并删除
private static
. 这提供了相同的功能,但防止在其他地方访问额外的方法,因此公共方法仍然是独立的,就像原来一样。