Почему выражения переключения типа 'System :: Guid' недопустимы? - PullRequest
2 голосов
/ 21 июля 2010
void Foo(Type^ type)
{
  System::Guid id = type->GUID;
  switch (id)
  {
  case System::Byte::typeid->GUID:
    ...
    break;
  ...
  }

Очевидно, регистр выражений не является константой.Но я хотел бы знать, почему GUID не может быть известен во время компиляции?(я думаю, глупый вопрос).

В конце концов, похоже, что для тестирования против typeid нужно использовать имбирный код if then else, и это единственный путь, верно?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Проще говоря: CLR не имеет представления метаданных Guid ... или даже DateTime или Decimal, как другие очевидные кандидаты. Это означает, что нет постоянного представления Guid, и случаи переключения должны быть константами, по крайней мере, в C #, и я подозреваю, что и в C ++ / CLI.

Теперь, когда не имеет для блокирования ... C # допускает использование константных десятичных значений с помощью помадки, а языки могут делать то же самое для Guids, а затем Вы, чтобы включить их. В конце концов, язык может решить, как будет реализовано переключение.

Я подозреваю, что разработчики C ++ / CLI считали, что это будет достаточно редкий вариант использования, когда не стоит усложнять язык и компилятор для его поддержки.

1 голос
/ 21 июля 2010

В выражении switch в .NET могут использоваться только строки, целочисленные типы и перечисления.

...