我在以下代码中收到编译错误“并非所有代码路径返回值”,为什么?!
public class SomeEntity
{
public int m_i;
public SomeEntity(int i)
{
m_i = i;
}
public override string ToString()
{
return m_i.ToString();
}
public static int someFunction(int i) { return i + 100; }
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
}
}
我似乎无法弄明白...... 我尝试将外部foreach循环转换为linq表达式
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
return arr.Select(Xenv =>
Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)))
);
}
但后来我遇到了一个错误:/
答案 0 :(得分:6)
因为arr可能是空的并且你不会在foreach循环内返回。在foreach循环之后放回一个。
public static IEnumerable GetEntities()
{
int[] arr = { 1, 2, 3 };
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
return Enumerable.Empty<int>(); // <<<< this is what you need
}
答案 1 :(得分:1)
您要替换的yield
代码已返回IEnumrable<SomeEntity>
而新代码返回IEnumarable<IEnumrable<SomeEntity>>
。
您可以使用SelectMany
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
return arr.SelectMany(Xenv =>
Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)))
);
}
旁注,您使用旧的非泛型IEnumerable
来阻止.Net编译器进行类型一致性检查。始终使用具有特定类型的通用IEnumerable<>
。
答案 2 :(得分:1)
问题出在'foreach'循环中:程序不能假设循环总是至少迭代一遍它。
如果迭代的数组长度为0,则不会调用循环内的代码;因此不会触发退货声明;导致错误,并非所有代码路径都返回值。 为了解决这个问题,您需要在循环之外放置一个return语句:
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
//INSERT RETURN STATEMENT HERE
}
答案 3 :(得分:0)
如果你在你的方法上使用任何返回类型,你必须在方法的最后一个大括号之前返回任何方法类型的东西。如果你使用返回类型为void
,你不需要返回任何内容public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
var numcol = Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
return numcol;
}