2014-01-15 4 views
3

С 'At compile time, an element that is typed as dynamic is assumed to support any operation', я бы предположил, что это означало бы, что если бы я использовал его в операторе switch, компилятор предположил бы, что динамическая переменная будет поддерживаемым типом для оператора switch.Почему оператор C# switch не принимает тип «dynamic»?

Вопреки моему, заявление

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

Поскольку для ключевых слов «case:» требуется значение literal/constant. Что будет динамическим литералом? – elgonzo

+0

Поскольку тип, который вы переключаете, должен быть известен во время компиляции. Динамические значения не известны во время компиляции, только во время выполнения. – danludwig

+0

Почему бы не 'switch ((string) вещь)', поскольку вы явно уже знаете, что такое тип? –

ответ

3

Поскольку константы, используемые в ярлыках case, должны быть константами времени компиляции, совместимыми с управляющим типом.

Вы не будете уверены в переменной dynamic во время компиляции.

Как вы узнаете, из какого значения вы сравните в себе case-label, поскольку динамическая переменная может содержать любой тип значения.

Посмотрите на этот

dynamic thing = "thing"; 
//and some later time `thing` changed to 
thing = 1; 

Теперь подумайте о вашем случае метки (в которой тип значения вы будете сравнивать)

+0

Если вы собираетесь что-то процитировать, вы должны указать источник этой цитаты. – Servy

0

Поскольку утверждения case должны содержать только константы. Таким образом, ограничение только для «родных» данных (int, double, float и т. Д.) И строк. Dynamic может содержать все виды данных, включая ссылочные типы.

2

Поскольку операторы случае должны содержать только константы, если вы накладываете вещь к string:

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; 
     } 
    } 
+0

+1 для творчества ... также, НИКОГДА НЕ ДЕЛАЙТЕ ЭТО! – sircodesalot

+0

согласился ... но просто пытался показать, как заставить его работать. –

+0

Он хочет знать, в чем причина, которая не позволяет, а не как ее решить. Это не ответ на вопрос. –

Смежные вопросы