【问题标题】:A switch expression or case label must be bool (or ...)switch 表达式或 case 标签必须是 bool(或 ...)
【发布时间】:2013-08-17 02:06:05
【问题描述】:

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

switch 表达式或 case 标签必须是 bool、char、string、integral、enum 或相应的可空类型

代码:

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

【问题讨论】:

  • btn.BackColor的类型是什么?
  • 我问的是btn.BackColor 的具体类型,而不是btn
  • 您是否尝试过定义默认情况?同样,它是否编译或您在编译时遇到该错误?
  • “System.Drawing.Color”类型
  • 我喜欢这些类型的黑客。您基本上是根据按钮中的背景颜色来确定要做什么。史诗。我有强烈的责任告诉你UI is Not Data

标签: c#


【解决方案1】:

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

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

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

你可以这样做

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

【讨论】:

    【解决方案2】:

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

    来自 C# 语言规范,8.7.2:

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

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

    【讨论】:

      【解决方案3】:

      你不能打开BackColor,因为它不是一个整数类型。

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

      您需要找到BackCOlor 的唯一属性(例如Name)并打开它。

      【讨论】:

        【解决方案4】:

        正如其他答案所指出的,System.Drawing.Color 不是switch 语句中的可用类型。 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"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 2018-09-13
          • 1970-01-01
          • 2021-02-07
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多