具有yield return的方法不会引发异常。

6

我在 Visual Studio 中有这段代码,当参数为空时,不会抛出异常,但我无法弄清为什么!是 yield return 搞错了吗?

IEnumerable<string> Method(string s)
{
    if(string == null)
    {
        throw new Exception();
    }

    if(dictionary.TryGetValue(s, out list))
    {
        foreach(string k in list)
        {
            yield return k;
        }
    }
}
1个回答

11

你有一个迭代器,直到开始枚举(即消费)它才会执行。要获取异常,您可以在foreach语句中调用此方法,或使用一些具有立即执行功能的LINQ运算符(ToList、ToArray、First 等):

foreach(var s in Method(null))
// or
Method(null).ToList();

更多阅读 yield (C# 参考)

如果您想立即验证参数,则应将此方法拆分为两个方法:

public IEnumerable<string> Method(string s)
{
    if(s == null)
       throw new ArgumentNullException(nameof(s));

    return MethodIterator(s);
}

private IEnumerable<string> MethodIterator(string s)
{
    if(dictionary.TryGetValue(s, out list))
    {
        foreach(string k in list)
           yield return k;
    }
}
在这种情况下,外部方法是简单的方法,并且将立即执行(因此我们会得到参数检查)。 另一个方法仍然是迭代器,它将具有延迟执行,但它将接收已经验证的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接