Я ожидаю, что следующие три строки кода будут одинаковыми:
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
, поэтому его нельзя обнулить.
Что еще хуже, ReSharper предлагает заменить второй оператор объединяющим выражением NULL, превратив его в выражение 3. Поэтому, если я позволю ReSharper сделать свое дело, тип переменной изменится с DateTime?
на DateTime
. ].
На самом деле, предположим, что в оставшейся части метода я бы использовал
if (someCondition) dateTimeNullable2 = null;
Это будет нормально компилироваться, пока я не позволю ReSharper заменить второе выражение нулевой объединенной версией.
Насколько мне известно, замена
somevar != null ? somevar : somedefault;
на
somevar ?? somedefault;
действительно должна дать тот же результат. Но для неявного ввода типа, допускающего значение NULL, компилятор, кажется, угрожает ??
, как будто это означает.
somevar != null ? somevar.Value : somedefault;
Итак, я думаю, мой вопрос заключается в том, почему неявный тип изменяется, когда я использую ??
, а также где в документации я могу найти информацию об этом.
Кстати, это не реальный сценарий, но я хотел бы знать, почему использование ??
меняет (неявный)тип.