正如您所预期的那样,这段代码会产生编译器错误:
public static IEnumerable<int> Foo()
{
}
并非所有代码路径都返回一个值
然而,这段代码会编译通过,但会提示存在无法到达的代码:
public static IEnumerable<int> Foo()
{
if(false)
{
yield return 0;
}
}
这会生成一个空的可枚举对象。为什么这样做有效,并且是否定义了这种行为?
正如您所预期的那样,这段代码会产生编译器错误:
public static IEnumerable<int> Foo()
{
}
并非所有代码路径都返回一个值
然而,这段代码会编译通过,但会提示存在无法到达的代码:
public static IEnumerable<int> Foo()
{
if(false)
{
yield return 0;
}
}
public static IEnumerable<int> Foo()
{
}
null
吗?一个空可枚举对象?它不知道 - 所以它不允许你编译。
public static IEnumerable<int> Foo()
{
if(false)
{
yield return 0;
}
}
yield return
(即使不可到达), 这足以让它知道您想要返回一个可枚举对象(因此可以设置必要的状态机)。现在,当代码执行时,你实际上从未到达那个 yield return
行(因此编译器会发出警告) - 所以调用者获得的是一个空的可枚举对象。
这是预期的。
考虑到第二个代码示例的丑陋和不直观,您可能希望改用:如果函数末尾没有 yield break,编译器将假定有一个(yield break),就像普通函数中的 return; 语句一样。
public static IEnumerable<int> Foo()
{
yield break;
}
由于编译后更清晰明确,编译器也不会抱怨代码无法到达。