切换表达式或大小写标签必须是bool(或......)

时间:2013-08-16 17:13:21

标签: c#

为什么这个swich语句不起作用,给出错误:

  

开关表达式或大小写标签必须是bool,char,string,integral,enum或相应的可空类型

代码:

 switch (btn.BackColor)
 {
     case Color.Green:
         break;
     case Color.Red:
         break;
     case Color.Gray:
         break;
 }

4 个答案:

答案 0 :(得分:6)

错误本身就是不言自明的。它告诉你switch表达式必须是以下类型之一:sbyte,byte,short,ushort,int,uint,long,ulong,char,string。或者作为C#语言规范建议

  

从开关表达式的类型到以下可能的控制类型之一,必须存在一个用户定义的隐式转换(第6.4节):sbyte,byte,short,ushort,int,uint,long,ulong,char, string,或者,对应于其中一种类型的可空类型。

你可以看到BackColor在这里返回你的类型并且它不满足上述任何规则,因此错误。

你可以这样做

switch (btn.BackColor.Name)
{
   case "Green":
      break;
   case "Red":
      break;
   case "Gray":
      break;
}

答案 1 :(得分:6)

问题是您无法在Color语句中使用switch。它必须是以下类型之一,其中一种类型的可空版本,或者可转换为以下类型之一:sbytebyteshortushortintuintlongulongcharstring

来自C#语言规范,8.7.2:

  

•否则,从switch表达式的类型到以下可能的控制类型之一,必须存在一个用户定义的隐式转换(第6.4节):sbyte,byte,short,ushort,int,uint,long,ulong ,char,string或者,与这些类型之一对应的可空类型。

在您的情况下,您可以通过使用字符串或仅使用一组if / else语句来解决此问题。

答案 2 :(得分:3)

您无法启用BackColor,因为它不是整数类型。

您只能打开整数类型,枚举(实际上是整数类型)和字符和字符串。

您需要找到唯一的BackCOlor属性(例如Name)并启用该属性。

答案 3 :(得分:2)

正如其他答案所指出的,System.Drawing.Colorswitch语句中不是可用的类型。 Color是一个有趣的类型,因为它的行为类似于代码中的枚举,但这是因为它具有每个System.Drawing.KnownColor的静态属性,这是一个枚举类型。因此,当您在代码中看到Color.Green时,这是Color类在幕后所做的事情:

public static Color Green
{
  get
  {
    return new Color(KnownColor.Green);
  }
}

了解这些信息后,您可以编写这样的代码,以便在交换机中使用BackColor属性:

if (btn.BackColor.IsKnownColor)
{
    switch (btn.BackColor.ToKnownColor())
    {
        case KnownColor.Green:
            break;
        case KnownColor.Red:
            break;
        case KnownColor.Gray:
            break;
    }
}
else
{
    // this would act as catch-all "default" for the switch since the BackColor isn't a predefined "Color"
}