编程语言
首页 > 编程语言> > c#-使用yield时,在try / catch中包装对迭代器的调用

c#-使用yield时,在try / catch中包装对迭代器的调用

作者:互联网

我需要在要实现为迭代器(使用yield)的方法中执行一些笨拙的逻辑:

public IEnumerable<Things> GetMoreThings() {
    while (goodStuffHappens()) {
        Things moreThingsIWant = TemptFateAgain();
        if (moreThingsIWant.Any())
            yield return moreThingsIWant;
    }
}

在调用方法中,我需要将对GetMoreThings的调用包装在try / catch中,然后yield返回结果:

try {
    foreach (Things thing in Helpful.GetMoreThings())
        yield return thing;
}

catch (Exception e) {
    //crash, burn
}

发起者将立即意识到这是不可能的-there is no such thing as a yield inside a try/catch block(仅尝试/最终).

有什么建议吗?

解决方法:

这两个答案都是正确的.这个没有内置的快捷方式,您需要在一段时间内梳理迭代器,而不是for循环,以便将对Enumerator.MoveNext()的调用与对Enumerator.Current的使用分开.

IEnumerator<Things> iterator = Helpful.GetMoreThings.GetEnumerator();
bool more = true;

while (more) {
    try {
        more = iterator.MoveNext();
    }
    catch (Exception e) {
        //crash, burn
    }

    if (more)
        yield return iterator.Current;
}

标签:yield-return,try-catch,c
来源: https://codeday.me/bug/20191027/1943882.html