在这个答案中,https: //stackoverflow.com/a/8649429/1497 Eric Lippert说"我们很有可能在下一版本的C#中解决这个问题;对于开发人员而言,这是一个主要的痛点". foreach循环使用变量.
在下一个版本中,每次运行"foreach"循环时,我们将生成一个新的循环变量,而不是每次都关闭相同的变量.这是一个"突破"的变化,但在绝大多数情况下,"休息"将是修复而不是导致错误.
我无法找到任何表明此更改尚未完成的内容.有没有迹象表明这是foreach循环在C#5中的工作方式?
在C#中,我不能隐式转换long成int.
long l = 5;
int i = l; // CS0266: Cannot implicitly convert type 'long' to 'int'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)
这会产生所述错误.这是正确的; 如果我这样做,由于错误的截断,我有可能破坏我的数据.如果我决定我知道自己在做什么,那么我总是可以做一个明确的演员,告诉编译器可以截断,我知道最好.
int i = (int)l; // OK
Run Code Online (Sandbox Code Playgroud)
但是,使用foreach循环时,相同的机制似乎不适用.
IList<long> myList = new List<long>();
foreach (int i in myList)
{
}
Run Code Online (Sandbox Code Playgroud)
编译器甚至不会在这里生成警告,即使它基本上是相同的事情:未经检查的截断a long到a int,这可能会很好地破坏我的数据.
所以我的问题很简单:为什么这foreach不会产生与变量赋值相同的错误?
我已经使用这个函数创建了一个可以相互作用的lambda函数
static IEnumerable<Func<int>> MakeEnumerator(int[] values)
{
for (int a = 0; a < values.Length; a++)
{
yield return () => Values[a];
}
}
Run Code Online (Sandbox Code Playgroud)
我无法使用LINQ将其反转或转换为数组,而不会将所有值变为最后一个函数.示例代码(注意这只是演示了问题,它不是应用程序中的代码):
int[] start = {1,2,3};
IEnumerable<Func<int>> end = MakeEnumerator(start).Reverse<Func<int>>();
foreach (Func<int> i in end)
{
Console.WriteLine(i());
}
Run Code Online (Sandbox Code Playgroud)
我认为问题出在MakeEnumerator函数中.我如何修改它以使其工作或开始编写有效的替换反向函数.