3

这是VB.Net中的代码

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 中允许这种行为?

4

2 回答 2

2

问题的症结似乎是这个

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

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

为什么 C# 阻止分配给 foreach 迭代变量?

如果您查看一组 lopping 结构和语言,C# 在这里是个奇怪的球。在几乎所有其他情况下(甚至在 Java 中foreach),分配给循环构造的迭代变量是合法的。我知道的唯一其他情况是

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

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

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

于 2013-03-01T23:37:58.237 回答
1

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

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

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

恕我直言...

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

于 2013-03-01T23:24:53.153 回答