Я бы ожидать, что следующие три строки кода, чтобы быть таким же:используя сливающиеся нулевой оператор на обнуляемых типов изменений неявный тип
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 предлагает заменить второе заявление с выражением нулевой коалесценции, превращая его в выражение 3. Так что, если я позволю ReSharper делать свое дело, тип переменной будет меняться от DateTime?
к DateTime
.
В самом деле, допустим, что в оставшейся части методы, я хотел бы использовать
if (someCondition) dateTimeNullable2 = null;
Это будет компилировать просто отлично, пока я не позволить ReSharper заменить второе выражение с нулевой сливающейся версией.
AFAIK, заменив
somevar != null ? somevar : somedefault;
с
somevar ?? somedefault;
действительно должен производить тот же результат. Но для неявной типизации для типа с нулевым значением компилятор, похоже, угрожает ??
, как будто это означает.
somevar != null ? somevar.Value : somedefault;
Так что я думаю, мой вопрос, почему неявный тип изменяется, когда я использую ??
, а также где в документации, которую я мог найти информацию по этому вопросу.
BTW, это не сценарий реального мира, но я хотел бы знать, почему использование ??
изменяет (неявный) тип.
Почему вы ожидаете 'nullableDateTime ?? DateTime.Now' для создания «DateTime?», Когда у компилятора есть достаточная информация, чтобы знать, что результат никогда не будет «null»? –
@Damien: в моем первом и втором примере компилятор также имеет достаточную информацию, чтобы знать, что результат никогда не будет «null». Именно по этой причине я нахожу это поведение странным. – comecme
Но '?: 'поддерживает гораздо больший диапазон возможных входов (нет причин, по которым« условие »должно быть связано с любым результатом« выражение »вообще). Таким образом, для компилятора было бы необычным, чтобы выполнить этот анализ против '?:'. Принимая во внимание, что для '??', он точно знает, что результатом будет первое выражение без возможности того, чтобы это выражение было нулевым, или второе выражение. –