использование оператора объединения null для типов, допускающих значение NULL, изменяет неявный тип

Я ожидаю, что следующие три строки кода будут одинаковыми:

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;

Итак, я думаю, мой вопрос заключается в том, почему неявный тип изменяется, когда я использую ??, а также где в документации я могу найти информацию об этом.

Кстати, это не реальный сценарий, но я хотел бы знать, почему использование ??меняет (неявный)тип.

14
задан comecme 16 April 2012 в 08:07
поделиться