相同的案件条件

时间:2011-08-11 18:01:12

标签: c# vb.net switch-statement case-statement vb.net-to-c#

我正在将一些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;
}

错误是:

  

Label'case“FSTF”:'已在此switch语句中出现。

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

2 个答案:

答案 0 :(得分:13)

来自documentation for Select...Case

  

如果testexpression与多个expressionlist子句中的Case子句匹配,则只运行第一次匹配后的语句。

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

答案 1 :(得分:2)

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

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