То, что спрашивают здесь, не совсем понятно для меня, но я надеюсь, что я получил это сейчас.
Учитывая код ниже:
void F(Object obj) {
var isEnum obj is Enum;
...
}
Какие частиСтандарт C # указывает, что isEnum
имеет значение true, когда obj
является экземпляром типа enum?
В 14.9.10 является оператор в спецификации языка C # есть пять маркеров, описывающих, как он оценивается:
1-й пункт относится к случаям, когда obj
имеет более конкретный тип, чем System.Object
.
2-я пуля относится к обнуляемым типам.
4-я пуля относится к универсальным типам.
5-я пуляэто когда совпадений нет, а оператор is
оценивает значение false, что, как мы знаем, нет.
Можно ожидать, что 3-й пункт относится к приведенному выше коду.3-я пуля имеет четыре подпункта:
1-я подпункт применяется, если obj
является нулевым.
2-й подпунктbullet относится к обнуляемым типам.
4-й подпункт - это когда совпадений нет, а оператор is
оценивает значение false, что, как мы знаем, нет.
Можно ожидать, что применяется третий подпункт:
В противном случае, пусть R будет типом времени выполнения экземпляра, на который ссылается e.Если R и T одинакового типа, если R является ссылочным типом и существует неявное ссылочное преобразование из R в T, или если R является типом значения, а T является типом интерфейса, который реализован с помощью R, результат равен true.
Тем не менее, здесь есть что-то особенное в типах перечислений, отсутствующих здесь.Предполагая, что obj
является экземпляром типа enum MyEnum
, ни одно из предложений не соответствует приведенному выше коду:
R и T не совпадают, поскольку R равен MyEnum
, а Tравен System.Enum
.
R равен MyEnum
, который является типом значения (11.1.9), а не ссылочным типом.
T это System.Enum
, который не является типом интерфейса.
Я не хочу утверждать, что в спецификации есть ошибка, но после подробного прочтения 14.9.10 IЯ не могу понять, как is Enum
может оценить как истинное, если указать в штучной упаковке ссылку на тип перечисления.
Зная, что люди, работающие в области стандартов, в целом намного умнее меня, я, вероятно, что-то упустил, но даже если бы я неЭто не должно помешать вам использовать is Enum
для проверки, является ли тип перечислением.Я уверен, что это не деталь реализации, которую можно использовать следующим образом.