2013-03-01 123 views
3

下面是在VB.NetForeach循环VB.Net到C#代码转换

If Not queryItems Is Nothing Then 
       For Each qItem As String In queryItems 
        qItem = qItem.ToLower() 
       Next 
End If 

代码和它的在c# “等效” 代码(使用的SharpDevelop/developerfusion/Telerik的转换器/ VS 2012 “粘贴为C#”法)

if (queryItems != null) 
{ 
    foreach (string qItem in queryItems) 
    { 
     qItem = qItem.ToLower(); 
    } 
} 

C#编译器(这是正确的)具有以下

"Cannot assign to 'qItem' because it is a 'foreach iteration variable'" 

抱怨我很奇怪,为什么这种行为是对在VB.Net中犯错?

+0

你可能在这里找到关于这方面的信息(http://stackoverflow.com/questions/ 7838079 /为什么我们不能分配一个foreach迭代变量而我们可以完全修改) – 2013-03-01 23:22:49

+2

目前还不清楚它在VB版本中预期会完成什么 - 当然,它实际上没有将小写版本“保存”回原始集合,是不是? – 2013-03-01 23:22:52

+0

这有帮助吗? http:// stackoverflow。com/questions/2037988/changing-foreach-iteration-variable-and-implementation-differences-between-c-sha – as1 2013-03-01 23:25:49

回答

1

想要在一个循环中将(数组?列表?)中的每个字符串设置为小写,在一个循环中是完全合理的。

建议:只使用一个好老 “为()” 循环 -

// Assuming array syntax... 
if (queryItems != null) 
{ 
    for (int i=0; i < queryItems.Length; i++) 
    { 
     queryItems[i] = queryItems[i].ToLower(); 
    } 
} 

恕我直言...

PS: 我不知道,如果VB.Net版本曾经实际工作如预期。你知道吗?

+0

我没有注意到逻辑或它在做什么 - 通过阅读和更改vb花费的时间更长 - 所以我决定转换这个类。 这次我对语言功能更感兴趣 – Sekhar 2013-03-01 23:30:30

+0

VB.NET版本按预期工作,只是在VS 2010中测试过。 – Neolisk 2013-03-02 00:57:13

2

问题的症结似乎是这个

我很奇怪,为什么这种行为是在VB.Net允许?

一个更好的问题可能是以下

为什么C#防止分配到的foreach迭代变量?

如果你看一套lopping结构和语言C#在这里是奇怪的球。在几乎所有其他情况下(即使在Java foreach中),分配给循环结构的迭代变量也是合法的。唯一的其他情况下,我真的知道的是

  • F#:变量是只读的默认情况下,虽然所以这只是用语言
  • 阿达的其他部分保持一致:在组合不允许声明for
  • 循环值的分配

VB.Net实际上比C#更符合标准。

不幸的是,目前尚不清楚为什么C#做出了这个选择。这里有很多猜测的答案,但直到埃里克或安德斯做了一个博客文章,对此,真正的原因将仍然未知

+0

我曾经在Java中编程 - 但由于某种原因,我总是认为迭代变量不能重新分配..感谢您的意见! – Sekhar 2013-03-01 23:51:59