【问题标题】:Foreach loop VB.Net to C# Code ConversionForeach 循环 VB.Net 到 C# 代码转换
【发布时间】:2013-03-01 23:18:58
【问题描述】:

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

【问题讨论】:

  • 你可以在here找到相关信息
  • 目前尚不清楚它在 VB 版本中的预期效果——它肯定不会真正将小写版本“保存”回原始集合,对吗?
  • @JonSkeet - 非常敏锐的观察 - 我正在从一个代码到另一个代码进行愚蠢的转换 - 因为添加更改变得很痛苦。我现在可以删除该代码!

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


【解决方案1】:

问题的关键似乎是这个

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

更好的问题可能如下

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

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

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

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

不幸的是,尚不清楚 C# 做出此选择的原因。那里有很多推测性的答案,但在 Eric 或 Anders 对此发表博客文章之前,真正的原因仍然未知

【讨论】:

  • 我以前用 Java 编程 - 但由于某种原因,我一直认为迭代变量不能重新分配.. 感谢您的输入!
【解决方案2】:

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

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

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

恕我直言...

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

【讨论】:

  • 我没有注意逻辑或它在做什么 - 通读并在 vb 中进行更改需要更长的时间 - 所以我决定转换这个类。这次我对语言功能更感兴趣
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多