C#开关与VB案例陈述

我最近从VB切换到C#。 我注意到的一件事是,在C#中,我在使用比较作为案例的一部分时遇到了问题。 我不确定如何用文字解释它,所以这里是我想要做的一个例子。

在VB中,我的代码看起来像这样,并且工作得很好。

Select Case ExamScore Case Is >= 90 Grade = "A" Case Is >= 80 Grade = "B" Case Is >= 70 Grade = "C" Case Is >= 60 Grade = "D" Case Else Grade = "F" End Select 

另一方面,在C#中,Visual Studio告诉我“> =”是一个无效的表达式。

  switch (examScore) { case >= 90: grade = "A"; break; case >= 80: grade = "B"; break; case >= 70: grade = "C"; break; case >= 60; grade = "D"; break; default: grade = "F"; break; } 

我在这里做错了什么,或者在C#中根本不可能做到这一点?

非常感谢你提前!

这个答案的上半部分适用于7之前的C#版本。请参阅下面的版本7更新行

这是不可能的。 C# 开关只能打开完全相等:

每个案例标签指定一个常量值。 控制转移到switch部分,其case标签包含一个与switch表达式的值匹配的常量值,

您可以用一堆if / else语句替换它,或者如果您愿意,可以制作看起来非常紧凑的东西,但有些可能会皱眉 – 一组条件运算符:

 grade = examScore >= 90 ? "A" : examScore >= 80 ? "B" : examScore >= 70 ? "C" : examScore >= 60 ? "D" : "F"; 

使用C#7, switch已得到显着增强 ,现在可以在case应用更多条件,尽管它仍然不像VB版本那样“干净”。 你可以这样做:

 switch (examScore) { case int es when es >= 90: grade = "A"; break; case int es when es >= 80: grade = "B"; break; case int es when es >= 70: grade = "C"; break; case int es when es >= 60; grade = "D"; break; default: grade = "F"; break; } 

假设examScore是一个int ,这有点滥用新的“类型上的模式匹配”工具,以便能够在case子句中说些什么 ,然后使用when子句将任意条件应用于新引入的变量。

与VB不同,C#switch语句类似于“equals”检查。 因此,您可能需要一个if else梯形图来完成此任务。

您可以尝试以下方式:

 private char Grade(int marks) { Dictionary grades = new Dictionary { { 60, 'A' }, { 50, 'B' } }; foreach (var item in grades) { if (marks > item.Key) return item.Value; } return 'C'; } 

这在C#中是不可能的。

使用一堆if而不是。

你可以拥有很好的function:

 public string Grade(int examScore) { if(examScore>=90) { return "A"; } if(examScore>=80) { return "B"; } if(examScore>=70) { return "C"; } if(examScore>=60) { return "D"; } return "F"; } 

如果你真的想要一个switch语句,你可以使用整数除法

  int i = 69; switch (Math.Min(9, i / 10)) { case 9: Grade = "A"; break; case 6: Grade = "B"; break; }