为什么这个swich语句不起作用,给出错误:
开关表达式或大小写标签必须是bool,char,string,integral,enum或相应的可空类型
代码:
switch (btn.BackColor)
{
case Color.Green:
break;
case Color.Red:
break;
case Color.Gray:
break;
}
答案 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
。它必须是以下类型之一,其中一种类型的可空版本,或者可转换为以下类型之一:sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,char
,string
来自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.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"
}