Как я могу использовать Nullable Operator с Null Conditional оператором?

Старый способ

int? myFavoriteNumber = 42;
int total = 0;
if (myfavoriteNumber.HasValue)
  total += myFavoriteNumber.Value *2;

Новый способ?

int? myFavoriteNumber = 42; 
total += myFavoriteNumber?.Value *2; //fails 

person halfbit    schedule 13.03.2016    source источник
comment
Что не так с int total = (myfavoriteNumber.HasValue) ? myFavoriteNumber.Value * 2 : 0;? Еще одна строка и более читаемая, чем предложенный вами новый способ   -  person Shadow Wizard Wearing Mask V2    schedule 13.03.2016
comment
@ShadowWizard Я предполагаю, что он может захотеть использовать эту функцию несколько раз, отсюда и использование +=, чтобы он мог вести промежуточный итог? Я просто предполагаю. Мне все равно понравился ваш комментарий, так как я согласен с вами.   -  person K-Dawg    schedule 24.03.2016
comment
@PrimeByDesign Я бы выбрал ??, как в этом ответе.   -  person Zev Spitz    schedule 25.05.2017


Ответы (4)


Оператор распространения нуля ?. будет, как говорится, распространять нулевое значение. В случае int?.Value это невозможно, так как тип Value, int, не может быть нулевым (если бы это было возможно, операция стала бы null * 2, что бы это значило?). Таким образом, «Старый способ» по-прежнему актуален.

person mnwsmit    schedule 13.03.2016
comment
Что бы это значило? Кстати, обычно любое число, умноженное на NULL, возвращает NULL. Например, так работает обычный SQL. NULL часто означает, что я не знаю значение. Представьте себе такой пример: я умножаю 5 яблок на NULL $ за яблоко. Так что я не знаю стоимость яблока. Следствием этого является то, что я не могу знать общую стоимость, поэтому результат равен NULL. - person Massimiliano Kraus; 19.05.2017

Попробуй это:

int? myFavoriteNumber = 42; 
total += (myFavoriteNumber??0) *2; 

Выражение (myFavoriteNumber?? 0) возвращает 0, если myFavoriteNumber равно нулю.

person Mohamed ElHamamsy    schedule 13.03.2016

Я думаю, вы неправильно поняли использование условного оператора null. Он используется для замыкания цепочки ifs на null, когда на одном из шагов получается null.

Вот так:

userCompanyName = user?.Company?.Name;

Обратите внимание, что userCompanyName будет содержать null, если user или user.Company равно null. В вашем примере total не может принять null, поэтому речь идет скорее об использовании ?? чем что-либо еще:

total = (myFavoriteNumber ?? 0) * 2;
person A. Chiesa    schedule 13.03.2016

Попробуй это

int? myFavoriteNumber = 42; 
total += (myFavoriteNumber.Value!=null)? myFavoriteNumber.Value*2 : 0;
person Nithila Shanmugananthan    schedule 13.03.2016