Вопрос по c# – использование объединяющего нулевого оператора для обнуляемых типов изменяет неявный тип

13

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

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, this isn't a real world scenario, but I would like to know why using ?? changes the (implicit) type.

Error: User Rate Limit Exceeded?:Error: User Rate Limit ExceededconditionError: User Rate Limit ExceededexpressionError: User Rate Limit Exceeded?:Error: User Rate Limit Exceeded??Error: User Rate Limit Exceeded Damien_The_Unbeliever
Error: User Rate Limit ExceedednullError: User Rate Limit Exceeded comecme
Error: User Rate Limit ExceedednullableDateTime ?? DateTime.NowError: User Rate Limit ExceededDateTime?Error: User Rate Limit Exceedednull? Damien_The_Unbeliever

Ваш Ответ

2   ответа
5

Error: User Rate Limit Exceeded

7.13

The type of the expression a ?? b depends on which implicit conversions are available on the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a (provided that a has a type), B is the type of b (provided that b has a type), and A0 is the underlying type of A if A is a nullable type, or A otherwise.

Error: User Rate Limit Exceeded??Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded7.14Error: User Rate Limit Exceeded?:Error: User Rate Limit ExceededxError: User Rate Limit ExceededyError: User Rate Limit Exceededb ? x : yError: User Rate Limit ExceededimplicitError: User Rate Limit Exceeded

If an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression

Error: User Rate Limit ExceededNullable(T)Error: User Rate Limit ExceededimplicitError: User Rate Limit ExceededTError: User Rate Limit ExceededNullable(T)Error: User Rate Limit ExceededexplicitError: User Rate Limit ExceededNullable(T)Error: User Rate Limit ExceededTError: User Rate Limit ExceededNullable(T).

9

Error: User Rate Limit Exceeded

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime 
    : DateTime.Now;

Error: User Rate Limit Exceeded

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime.Value 
    : DateTime.Now;

Error: User Rate Limit Exceeded

The type of the expression a ?? b depends on which implicit conversions are available between the types of the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a, B is the type of b (provided that b has a type), and A0 is the underlying type of A if A is a nullable type, or A otherwise.

Error: User Rate Limit ExceededaError: User Rate Limit ExceededNullable<Something>Error: User Rate Limit ExceededbError: User Rate Limit ExceededSomethingError: User Rate Limit ExceededSomethingError: User Rate Limit ExceededpointError: User Rate Limit Exceeded

Error: User Rate Limit ExceededMSDN documentation on ??Error: User Rate Limit ExceededUsing Nullable TypesError: User Rate Limit ExceededvarError: User Rate Limit Exceededa ?? bError: User Rate Limit ExceedednotError: User Rate Limit Exceededa != null ? a : bError: User Rate Limit Exceeded comecme

Похожие вопросы