Visual Studio C#方法(Yield)未检测到返回路径

t98cgbkg  于 2023-11-21  发布在  C#
关注(0)|答案(4)|浏览(145)

请考虑下面的小方法:

IEnumerable<ObjectTest> CreateObjectList()
{
    bool aTest = false;
    ObjectTest anObject = null;
    if (aTest == true)
    {
        foreach (var item in aTestList)
        {
            yield return anObject;
        }
    }
}

字符串
我觉得这段代码不应该编译。有一些路径不返回布尔测试失败。编译器应该报告-:
并非所有代码路径都返回值。
但事实并非如此-有人能解释一下吗?
(.NET 4.0)
理查德

azpvetkf

azpvetkf1#

由于yield return在任何情况下都将返回一个迭代器,因此保证永远不会返回null。因此,yields的方法总是有一个返回值,即迭代器。迭代器是否返回任何元素在这里无关紧要。
也许thisthis也很有趣。

uidvcgyl

uidvcgyl2#

使用yield return并不意味着它涵盖了yield return范围之外的所有代码路径。
扩展一下HimBromBeere在评论中所说的话,请考虑一下:

IEnumerable<ObjectTest> CreateObjectList()
{
    bool aTest = false;
    ObjectTest anObject = null;
    List<ObjectTest> objects = new List<ObjectTest>();
    if (aTest == true)
    {
        foreach (var item in aTestList)
        {
            objects.Add(anObject);
        }

        return objects;
    }
}

字符串
这基本上就是你所做的,只允许从内部处理代码的foreach部分。上面的代码将抛出相同的错误。
正如在注解中所说的那样,您缺少的部分是,当您的if (aTest == true)无效时,您的代码的其余部分不会返回任何内容。您可以保留上面的代码,但只需包含以下内容:

if (aTest == true)
{
    ...
}

yield break;

xytpbqjk

xytpbqjk3#

请记住,你在C#中写的东西不一定是编译出来的,yield关键字是一种“语法糖”,它不会导致你写的东西。
尝试使用.Net反编译器(例如JustCode或dotPeek)打开编译后的代码,并检查IL(中间语言)结果。您将看到编译后的内容并非您所期望的。
简而言之,yield return只是“创建一个变量,填充它,然后返回它”的快捷方式。
你可以在这里看到更多的解释:http://www.dotnetperls.com/yield

t9eec4r0

t9eec4r04#

考虑一下在以下情况下,如果aTestList为空会发生什么:

IEnumerable<ObjectTest> CreateObjectList()
{
    foreach (var item in aTestList)
    {
        yield return item;
    }
}

字符串
你知道会发生什么吗?枚举器不会产生任何结果。这正是你的问题中的代码所发生的。

相关问题