Я ожидал бы, что следующие три строки кода будут одинаковыми:
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
Во всех случаях я назначаю nullableDateTime
новой переменной. Я бы ожидал, что тип всех переменных станет DateTime?
, так как это тип nullableDateTime
. Но, к моему удивлению, тип dateTimeWhatType
просто становится DateTime
, поэтому не имеет значения NULL.
Чтобы ухудшить ситуацию, ReSharper предлагает заменить второй оператор нулевым коалесцирующим выражением, превратив его в выражение 3. Поэтому, если я позволю ReSharper делать свое дело, тип переменной изменится с DateTime?
на DateTime
.
Действительно, скажем, что в оставшейся части метода я использовал бы
if (someCondition) dateTimeNullable2 = null;
Это будет компилироваться просто отлично, пока я не позволю ReSharper заменить второе выражение на нулевую коалесцирующую версию.
AFAIK, заменив
somevar != null ? somevar : somedefault;
с
somevar ?? somedefault;
действительно должен дать тот же результат. Но для неявной типизации для типа с нулевым значением компилятор кажется угрозой ??
, как будто это означает.
somevar != null ? somevar.Value : somedefault;
Итак, я думаю, мой вопрос в том, почему неявный тип изменяется, когда я использую ??
, а также где в документации я мог найти информацию об этом.
Кстати, это не сценарий реального мира, но я хотел бы знать, почему использование ??
изменяет (неявный) тип.