Почему оператор C # switch не позволяет использовать typeof / GetType ()?

Попробуйте:

<([^\s]+)(\s[^>]*?)?(?<!/)>

Он похож на ваш, но последний > не должен быть после косой черты, а также принимает h1.

13
задан Joan Venge 10 November 2009 в 20:34
поделиться

8 ответов

Проблема в том, что переключатель (согласно спецификации) работает только с примитивами (int и т. д.) и строками. Но да, было бы неплохо иметь соответствие стиля F # .

Из §8.7.2:

 метка переключателя:
 константное выражение case:
 дефолт :

... Управляющий тип оператора switch устанавливается выражением switch. Если тип выражения switch - sbyte, byte, short, ushort, int, uint, long, ulong, char, string или enum-type, тогда это управляющий тип переключателя заявление. В противном случае должно существовать ровно одно определяемое пользователем неявное преобразование (§6.4) из тип выражения переключения на один из следующих возможных управляющих типов: sbyte, byte, short, ushort, int, uint, long, ulong, char, строка. Если такого неявного преобразование существует, или, если существует более одного такого неявного преобразования, время компиляции возникает ошибка.

Однако очевидно, что работа с таким ограниченным набором позволяет использовать простой (и эффективный) IL. Обратите внимание, что строка обрабатывается через преобразование словаря в целое число.

13
ответ дан 1 December 2019 в 17:23
поделиться

Я бы добавил к прекрасному анализу Питера следующую мысль:

По сути, цель «переключателя» - выбрать одну из некоторого количества различных возможностей . Заданное значение типа enum, integer, Boolean или string может быть только одним значением, поэтому имеет смысл «переключаться» на такое значение. Но типы принципиально разные. У данного значения обычно есть много типов. Типы часто перекрываются . Предлагаемый «переключатель типа» не соответствует заявленному назначению конструкции переключателя.

14
ответ дан 1 December 2019 в 17:23
поделиться

Второй на посту Питера Халлама; это отличное объяснение.

Вы можете использовать TypeCode для работы с простыми типами.

switch (Type.GetTypeCode(myObj.GetType())) {
    case TypeCode.Boolean: ...
    case TypeCode.Char: ...
    case TypeCode.String: ...
    case TypeCode.Object: ...
    default: ...
} 
19
ответ дан 1 December 2019 в 17:23
поделиться

В MSDN есть хороший пост в блоге Питера Халлама , в котором объясняются проблемы включения непостоянных значений.

" порядок этикеток на корпусе становится важно при определении того, какой блок кода выполняется. Поскольку выражения метки case не константа, которую компилятор не может проверить что значения меток case отчетливо, так что это возможность который необходимо обслужить. Это работает вопреки интуиции большинства программистов насчет оператора switch в паре способов. Большинство программистов были бы удивлен, узнав, что изменение порядок их блоков case изменил смысл их программы. Повернуть это вокруг, было бы удивительно, если бы включаемое выражение было равно к выражению в метке case, но элемент управления не попал на эту метку. "

5
ответ дан 1 December 2019 в 17:23
поделиться

Вы можете сделать

switch ( myObj.GetType().Name )
{
    case "MyObject":
        Console.WriteLine ( "MyObject is here" );
        break;
}

Это работает, потому что переключение работает только с примитивными типами (как другие сказали).

4
ответ дан 1 December 2019 в 17:23
поделиться

Дело в том, что typeof не является константой, а регистры должны быть константами.

2
ответ дан 1 December 2019 в 17:23
поделиться

переключатель в C # работает только для интегралов или строк. myObj.GetType () возвращает тип, который не является ни целым, ни строковым.

2
ответ дан 1 December 2019 в 17:23
поделиться

Почему бы вам просто не набрать () это?

1
ответ дан 1 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: