c# - 命名迭代器和异常

标签 c# exception iterator

我正在编写一个方法,该方法需要检查一些参数,如果它们通过验证则返回一个 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/

相关文章:

c# - 如何使用 GetFolderPath 获取自定义文件夹路径?

c# - 从动态列表 PictureBox 移动图像

java - 从 onClickListener 内部处理深度异常

java - 循环性能差但顺序执行速度快

rust - 在不深度复制其元素的情况下分支迭代器

java - RandomIterator 不产生随机输出

c# - .NET 抛出 WebException 而不是设置 StatusCode

c# - 公钥 token 的作用是什么?

java - Google editboix 给出 InvalidElementStateException :Element is disabled and so may not be used for actions Command duration

C++迭代器问题