Да, это так.Как всегда, спецификация языка C # является окончательным источником 1 .
Из спецификации C # 3, раздел 7.12 (v3, а не 4, поскольку спецификация v4 входит в динамические детали, которые не 'здесь действительно актуально):
Тип выражения a ?? b
зависит от того, какие неявные преобразования доступны между типами операндов.В порядке предпочтения, типb - это A0, A или B, где A - это тип a, B - это тип b (при условии, что b имеет тип), а A0 - базовый тип A, если A - обнуляемый тип, или A в противном случае,В частности, a ?? b
обрабатывается следующим образом:
- Если A не является обнуляемым типом или ссылочным типом, возникает ошибка времени компиляции.
- Если A является обнуляемым типоми существует неявное преобразование из b в A0, тип результата - A0.Во время выполнения a сначала оценивается.Если a не нуль, a разворачивается к типу A0, и это становится результатом.В противном случае b вычисляется и преобразуется в тип A0, и это становится результатом.
- В противном случае, если существует неявное преобразование из b в A, типом результата является A. Во время выполнения сначала оценивается a,Если a не нуль, a становится результатом.В противном случае b вычисляется и преобразуется в тип A. И это становится результатом.
- В противном случае, если b имеет тип B и существует неявное преобразование из A0 в B, тип результата - B.время, а впервые оценивается.Если a не является нулем, a разворачивается в тип A0 (если A и A0 не имеют одинаковый тип) и преобразуется в тип B, и это становится результатом.В противном случае b вычисляется и становится результатом.
- В противном случае a и b несовместимы, и возникает ошибка времени компиляции.
Второй, третий и четвертыйсоответствующие маркеры.
1 Необходимо провести философскую дискуссию о том, является ли используемый вами компилятор фактическим источником истины... правда ли язык о том, что означало делать или что он в настоящее время делает ?