Да, так оно и есть. Как всегда, спецификация языка C# является окончательным источником .
От C# 3 спецификации, раздел 7,12 (v3, а не 4, как v4 спецификация идет в динамические детали, которые не очень актуальны здесь):
Тип выражения a ?? b
зависит от того, неявные преобразования доступны между типами операндов. В порядке предпочтения, тип a b - A0, A или B, где A - тип a, B - тип b (при условии, что b имеет тип), а A0 является базовым типом A, если A является нулевым типом, или A в противном случае , В частности, a ?? b
обрабатывается как следующим образом:
- Если А не обнуляемым тип или ссылочный тип, время компиляции ошибки происходит.
- Если A является нулевым типом и существует неявное преобразование от b до A0, результатом является A0. На этапе время выполнения сначала оценивается. Если значение не равно нулю, то разворачивается тип A0, и это становится результатом. В противном случае b оценивается и преобразуется в тип A0, и это становится результатом .
- В противном случае, если существует неявное преобразование от b до A, тип результата равен A. Во время выполнения сначала оценивается a. Если a не является нулевым, a становится результатом . В противном случае b оценивается и преобразуется в тип A, и это становится результатом .
- В противном случае, если b имеет тип B и существует неявное преобразование от A0 до B, то результатом является B. Во время выполнения сначала оценивается a. Если a не null, то a разворачивается до типа A0 (если только A и A0 не являются одинаковыми) и преобразуется в тип B, и это результат . В противном случае b оценивается и становится результатом.
- В противном случае a и b несовместимы, и возникает ошибка времени компиляции.
Вторая, третья и четвертая пули являются соответствующими.
Там философское обсуждение, которое будет иметься о том, что компилятор вам случится использовать это фактический источник истины ... правда о языке то, что это означало сделать или что это сейчас делает?
К ножной записке ... Я думаю, именно поэтому мы все наслаждаемся тем, что Эрик Липперп был вокруг :) –
@ Матвей: Одна из многих причин, да. Один интересный аспект Эрика заключается в том, что он может выступать в роли человеческого воплощения как spec *, так и компилятора ... –