9

老方法如何将Nullable运算符与空条件运算符一起使用?

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

新方式?

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

出了什么问题'INT总=(myfavoriteNumber.HasValue)? myFavoriteNumber.Value * 2:0;'?仍然是一条线,并且比你建议的“新方法”更具可读性 –

+0

@ShadowWizard我假设他可能想多次使用这个函数,因此使用+ =以便他可以保持运行总数?我只是猜测。我同意你的意见,我仍然喜欢你的评论。 –

+0

@PrimeByDesign我会用'??',如[this](https://stackoverflow.com/a/35970536/111794)回答。 –

回答

4

无效传播算子?就像它说的那样,传播null值。在int?.Value的情况下,这是不可能的,因为Value的类型int不能为null(如果可能,操作将变为null * 2,这意味着什么?)。因此,'老路'仍然是目前这样做的方式。

+0

_什么意思?_就像旁边一样,通常任何乘以NULL的数字都会返回NULL。例如,这就是普通SQL的工作原理。 NULL通常意味着“我不知道价值”。想象一下这个例子:我为每个苹果的NULL $ 5乘以5个苹果。所以我不知道苹果的成本。结果是_I不知道总成本,所以结果是NULL。 –

3

尝试这种情况:

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

表达式(myFavoriteNumber?? 0)中的myFavoriteNumber为空的情况下返回0。

3

我想你误解了使用null有条件的操作符。 它用于短路ifsnull的链,当其中一个步骤产生null时。

像这样:

userCompanyName = user?.Company?.Name; 

请注意,userCompanyName将包含null如果useruser.Companynull。 在你的例子total不能接受null,所以它更多的是使用?比什么都重要:

total = (myFavoriteNumber ?? 0) * 2; 
0

试试这个

int? myFavoriteNumber = 42; 
total += (myFavoriteNumber.Value!=null)? myFavoriteNumber.Value*2 : 0;