Старый способ
int? myFavoriteNumber = 42;
int total = 0;
if (myfavoriteNumber.HasValue)
total += myFavoriteNumber.Value *2;
Новый способ?
int? myFavoriteNumber = 42;
total += myFavoriteNumber?.Value *2; //fails
Старый способ
int? myFavoriteNumber = 42;
int total = 0;
if (myfavoriteNumber.HasValue)
total += myFavoriteNumber.Value *2;
Новый способ?
int? myFavoriteNumber = 42;
total += myFavoriteNumber?.Value *2; //fails
Оператор распространения нуля ?. будет, как говорится, распространять нулевое значение. В случае int?.Value это невозможно, так как тип Value, int, не может быть нулевым (если бы это было возможно, операция стала бы null * 2
, что бы это значило?). Таким образом, «Старый способ» по-прежнему актуален.
Попробуй это:
int? myFavoriteNumber = 42;
total += (myFavoriteNumber??0) *2;
Выражение (myFavoriteNumber?? 0
) возвращает 0, если myFavoriteNumber
равно нулю.
Я думаю, вы неправильно поняли использование условного оператора null
. Он используется для замыкания цепочки ifs на null
, когда на одном из шагов получается null
.
Вот так:
userCompanyName = user?.Company?.Name;
Обратите внимание, что userCompanyName
будет содержать null
, если user
или user.Company
равно null
. В вашем примере total
не может принять null
, поэтому речь идет скорее об использовании ?? чем что-либо еще:
total = (myFavoriteNumber ?? 0) * 2;
Попробуй это
int? myFavoriteNumber = 42;
total += (myFavoriteNumber.Value!=null)? myFavoriteNumber.Value*2 : 0;
int total = (myfavoriteNumber.HasValue) ? myFavoriteNumber.Value * 2 : 0;
? Еще одна строка и более читаемая, чем предложенный вами новый способ - person Shadow Wizard Wearing Mask V2   schedule 13.03.2016??
, как в этом ответе. - person Zev Spitz   schedule 25.05.2017