.net 为什么我会得到:“我会得到什么?”;lambda表达式中的迭代变量可能会产生意外结果;
可能重复:.net 为什么我会得到:“我会得到什么?”;lambda表达式中的迭代变量可能会产生意外结果;,.net,vb.net,.net,Vb.net,可能重复: 为什么我会得到:“lambda表达式中的迭代变量可能有意外的结果”?假设我有以下代码: Dim writeAbleColumns As String() = {"IsSelected", "IsFeeExpense", "IsSubscriptionRedemption"} With grid For Each column As DataGridViewColumn In .Columns column.ReadOnly = Not Array.Ex
为什么我会得到:“lambda表达式中的迭代变量可能有意外的结果”?假设我有以下代码:
Dim writeAbleColumns As String() = {"IsSelected", "IsFeeExpense", "IsSubscriptionRedemption"}
With grid
For Each column As DataGridViewColumn In .Columns
column.ReadOnly = Not Array.Exists(writeAbleColumns, Function(arrElement) column.Name = arrElement)
Next
End With
我得到警告:
Warning 1 Using the iteration variable in a lambda expression may have unexpected results. Instead, create a local variable within the loop and assign it the value of the iteration variable.
我不明白为什么将我的代码更改为以下代码会改变任何事情:
Dim writeAbleColumns As String() = {"IsSelected", "IsFeeExpense", "IsSubscriptionRedemption"}
With grid
For Each column As DataGridViewColumn In .Columns
Dim c As DataGridViewColumn = column
column.ReadOnly = Not Array.Exists(writeAbleColumns, Function(arrElement) c.Name = arrElement)
Next
End With
从根本上说,除了警告消失之外,没有任何变化。我只是有另一个变量指向我的变量。为什么要发出警告?可能会发生什么意外情况?在您的情况下,没有什么会出错 问题是,如果在循环继续后保存并使用lambda(例如,在事件处理程序中使用) 哦,这里已经有很长的引用列表了。lambda绑定到变量,而不是变量在lambda变成委托时的值。当循环变量更新时,绑定到该变量的每个创建的lambda也会看到变量的更改值,这可能是您不希望看到的。每次迭代循环时创建一个新变量会将每个lambda绑定到一个新的、不同的、不变的变量上 这是C#和VB的一个主要难点在C#5和VB 11中,我们正在更改循环闭包语义以缓解此问题。 有关更多信息,请参阅 蒂姆文章的最后几段: 我的文章:
我们也能为C#3和C#4编译器提供补丁吗?我每天都会遇到这种情况,而我们公司现在正赶上C4的潮流。我迫不及待地等着C#5,真的。@JamesDunne,你确定你指的是C#而不是.Net的版本吗?因为C#5编译器可以针对.Net 4.0,甚至更旧的版本。@svick:是的,当然编译器可以针对更旧的平台,但当您希望Visual Studio、一套TFS构建服务器以及您团队的所有编译器都是针对更旧平台的最新版本时,这一点就无关紧要了。实际上,在旧的编译器版本上获得补丁(希望是免费的)要比购买整个套件的最新版本来修复这个错误更容易、更便宜。@JamesDunne:我们不打算悄悄地改变现有编译器的行为,不,对不起!