为什么C#switch语句不能接受'动态'类型?

时间:2014-01-15 20:45:58

标签: c# dynamic switch-statement

'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。什么给出了什么?这种限制的原因是什么?

4 个答案:

答案 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语句中接受了动态类型。

快乐编码:)