2010-10-19 65 views
3

当这段代码完成时,myObject的结果是什么?如果空合并操作中的所有参数都为空,结果如何?

object myObject = "something"; 
object yourObject = null; 

myObject = null ?? yourObject; 
+5

你总是可以试试看,而不是问这里......你会希望结果是什么? – thecoop 2010-10-19 18:00:24

+0

答案为空。 – leppie 2010-10-19 18:01:59

+3

我认为这是一个有趣的问题,即使对于更有经验的开发人员来说答案是显而易见的。无论如何,堆栈溢出的存在是为了回答困难以及微不足道的问题,我认为(非冗余)简单的问题应该受到鼓励。 – 2010-10-19 18:07:41

回答

2

myObject的将是无效

这被翻译成 -

if (null == null) 
    myObject = yourObject; 
else 
    myObject = null; 
1

聚结运营商转换到这一点:

x ?? y 
x != null ? x : y 

因此,你拥有的一切:

myObject = null != null ? null : yourObject; 

这实际上是毫无意义的,因为null将始终为空。

+0

当然我的例子是非常简单和不现实的。谢谢你的解释。 – Brad 2010-10-19 18:09:18

+0

是的,我意识到这一点。 coalesce运算符的要点是提供一个值,以便在某些内容为null时使用......如果您尝试并使用该值,那么您可能不会收到空引用异常。例如:someString =(someString ??“”).ToLower(); – Dismissile 2010-10-19 18:15:18

+1

将可为空类型分配给不可空类型也很有用。例如:int?x = 1; int y = x ?? -1;如果您尝试将y分配给x而不使用??或做x.Value你会得到一个错误。如果你做了x.Value并且它的值为null,那么你也遇到了麻烦。 – Dismissile 2010-10-19 18:18:48

1

只是踢,这里是一个小桌子:

 
A ?? B -> R 
--------------------- 
a ?? any -> a; where a is not-null 
null ?? b -> b; for any b 
null ?? null -> null; implied from previous 

而且由于??只是一个(惊喜!)权相关的管道符,x ?? y ?? z - >x ?? (y ?? z)。像&&||,??也是短路操作。

...从?? Operator (C# Reference)

它(??)返回左边的操作数,如果它不为空;否则它返回右操作数。

...从C#3.0语言参考:

空聚结形式的表达?? b要求a是可空类型或引用类型。如果a是非空的,则结果为?? b是a;否则,结果是b。仅当a为空时,操作才会评估b。