Foreach循环VB.Net到C#代码转换

时间:2013-03-01 23:18:58

标签: sharpdevelop vb.net-to-c# code-conversion

这是VB.Net中的代码

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

它和#34;相当于" c#中的代码(使用sharpdevelop / developerfusion / telerik' s转换器/ 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中允许这种行为?

2 个答案:

答案 0 :(得分:2)

问题的症结似乎是这个

  

我想知道为什么在VB.Net中允许这种行为?

更好的问题可能是以下

  

为什么C#会阻止赋值给foreach迭代变量?

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

  • F#:默认情况下变量是只读的,所以这只是与语言其余部分的一致性
  • Ada:不允许在for语句
  • 中分配循环值

VB.Net实际上比C#更符合规范。

不幸的是,不清楚为什么C#做出了这个选择。那里有很多推测性的答案,但在埃里克或安德斯发表关于此事的博客文章之前,真正的原因仍然未知

答案 1 :(得分:1)

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

建议:只需使用旧的“for()”循环 -

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

... IMHO

PS: 我不确定VB.Net版本是否真的按预期工作。你知道吗?