从'At compile time, an element that is typed as dynamic is assumed to support any operation'开始,我认为这意味着如果我在switch
语句中使用它,编译器会认为动态变量是switch语句的支持类型。
与我的想法相反,声明
dynamic thing = "thing";
switch (thing) {
case "thing": {
Console.WriteLine("Was a thing.");
Console.ReadKey();
break;
}
default: {
Console.WriteLine("Was not thing.");
Console.ReadKey();
break;
}
}
给出编译时错误:A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type
。什么给出了什么?这种限制的原因是什么?
答案 0 :(得分:3)
因为case-labels中使用的常量必须是与管理类型兼容的编译时常量。
在编译时,您无法确定dynamic
变量。
您如何知道您将在case-label
中比较哪个值,因为动态变量可以包含任何类型的值。
看看这个
dynamic thing = "thing";
//and some later time `thing` changed to
thing = 1;
现在考虑你的案例标签(你将比较哪种类型的价值)
答案 1 :(得分:2)
因为case语句必须只包含常量,所以如果你将thing转换为字符串:
dynamic thing = "thing";
switch ((string)thing) {
case "thing": {
Console.WriteLine("Was a thing.");
Console.ReadKey();
break;
}
default: {
Console.WriteLine("Was not thing.");
Console.ReadKey();
break;
}
}
答案 2 :(得分:0)
因为case语句必须只包含常量。因此,仅将开关限制为“本机”数据(int,double,float等)和字符串。 Dynamic可以包含各种数据,包括引用类型。
答案 3 :(得分:-1)
升级您的VS,在VS 2017 switch语句中接受了动态类型。
快乐编码:)