6

一部のVB.NETコードをC#に変換しています。これは、VB.NETコードに慣れていて、問題をより迅速に解決するのに役立つためです。ただし、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コードでは、2番目のcaseステートメントは単なるダミーでした—または最初のcaseはダミーでしたか?

4

2 に答える 2

13

Select ... Caseのドキュメントから:

複数の句の句にtestexpression一致する場合、最初の一致に続くステートメントのみが実行されます。expressionlistCase

したがって、ここでは2番目のケースは事実上冗長です。個人的には、重複したケースを意図的に導入するよりも、ほぼ確実に見過ごされていたプログラミングエラーを強調する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 の間に別の独特の違いが生じます。つまり、VB.NET は、C# のようなDictionary文字列型を対象とする場合、その戦略をシーケンシャル ルックアップからルックアップに変更しません。これは、文字列型を使用する VB.NET のコンストラクトは、C# のコンストラクトよりも実行が遅くなる可能性があることを意味します。この理由 ( MarkJの功績) は、Visual Basic の case ステートメントには式を含めることができるのに対し、C# の case ステートメントには定数のみを含めることができるためです。Selectswitch

于 2011-08-11T20:17:24.657 に答える