6

我正在将一些 VB.NET 代码转换为 C#,因为我对它更满意,它可以帮助我更快地解决问题。但是,我遇到了这段代码,这在 VB.NET 中不是错误——但是将其转换为 C# 会产生编译器错误。

VB.NET 代码

Select Case name
    Case "FSTF"
    .....
    Case "FSTF"
    .....
End Select

C# 转换代码

switch(name) {
    case "FSTF":
        ....;
        break;
    case "FSTF":
        ....;
        break;
}

错误是:

标签 'case "FSTF":' 已出现在此 switch 语句中。

这里的解决方案是什么——这是否意味着在 VB.NET 代码中,第二个 case 语句只是一个虚拟语句——还是第一个 case 语句是一个虚拟语句?

4

2 回答 2

13

Select...Case 的文档中

如果testexpression匹配expressionlist多个子句中的一个Case子句,则仅运行第一个匹配项之后的语句。

所以这里第二种情况实际上是多余的。就我个人而言,我更喜欢 C# 方法来突出几乎可以肯定是未被注意到的编程错误,而不是故意引入重复的案例......

于 2011-08-11T18:03:28.590 回答
2

我认为这样做是为了使 VB.NET 与Visual Basic 6.0和更早版本兼容,因为这是它们的行为方式。如果 VB.NET 报告了像 C# 这样的编译错误,那么将较旧的 Visual Basic 代码移植到 VB.NET 会更加困难。

奇怪的是,VB.NET 似乎不够聪明,无法消除生成的CIL代码中的冗余情况。这导致了 C# 和 VB.NET 之间的另一个特殊差异。也就是说,当针对C# 等Dictionary字符串类型时,VB.NET 不会将其策略从顺序查找更改为查找。这意味着 VB.NET 的使用字符串类型的构造比 C# 的构造执行起来要慢。这样做的原因(归功于MarkJ)是因为 C# case 语句只能包含常量,而 Visual Basic case 语句可以包含表达式。Selectswitch

于 2011-08-11T20:17:24.657 回答