我正在编写一个方法,该方法需要检查一些参数,如果它们通过验证则返回一个 IEnumerable。例如
public static IEnumerable<double> GetEnum(int param)
{
if (!IsValidParameter(param))
{
throw new Exception();
}
while(true)
{
yield return 5.0;
}
}
但是,我相信由于延迟评估,当我使用错误参数运行我的单元测试但尚未调用任何 IEnumerable 方法时,不会抛出异常。
[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
var ie = GetEnum(bad_param);
}
我可以通过在另一个函数(例如 Foo)中构建 IEnumerable 来解决问题,然后检查 GetEnum 中的参数并调用 Foo,但是是否有无需创建多个函数的解决方案?
干杯,于尔根
最佳答案
由于迭代器 block 的定义方式,您目前需要两种方法来实现这一点:
public static IEnumerable<double> GetEnum(int param) {
if (!IsValidParameter(param)) {
throw new Exception();
}
return GetEnumCore(param);
}
private static IEnumerable<double> GetEnumCore(int param) {
while(true) {
yield return 5.0;
}
}
只有迭代器 block (GetEnumCore
) 被延迟; GetEnum
立即运行,执行您的检查。
关于c# - 命名迭代器和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149509/