如果左操作数到?? operator不为null,是否对右操作数进行求值?

我正在寻找使用?? C#中的operator(null-coalescing operator)。 但是MSDN上的文档是有限的。

我的问题:如果左侧操作数不为null,右手操作数是否会被评估?

与以往一样,C#规范是这类事情的最佳选择。

从C#5规范的第7.13节(强调我的):

一个空的合并表达formsa ?? b a ?? b要求a为可空类型或引用类型。 如果a是非null,则结果为a ?? b a ?? b是; 否则,结果是b仅当a为null时,操作才会计算b

有关执行任何转换的详细信息以及确切的行为,但这是给出问题的主要观点。 还值得注意的是,空合并运算符是右关联运算符,所以a ?? b ?? c a ?? b ?? c a ?? b ?? c被评估为a ?? (b ?? c) a ?? (b ?? c) …这意味着如果ab都为空,它只会评估c

为什么不试试:)

 void Main() { var leftOrRight = left ?? right; } public bool? left { get { Console.WriteLine ("Left hit"); return true; } } public bool right { get { Console.WriteLine ("Right hit"); return true; } } 

问题的答案是no ……第二个值没有得到评估

从规格:

一个空的合并表达formsa ?? b要求a为可空类型或引用类型。 如果a是非null,则结果为?? b是; 否则,结果是b。 仅当a为null时,操作才会计算b。

(重点补充)

看一下这个。 如果name不为null,则控制台显示“MyName”。 如果它为null,控制台显示“Called”然后“Allo”

 using System; public class Program { public static void Main() { string name = "MyName"; Console.WriteLine(name??test()); } private static string test() { Console.WriteLine("Called"); return "Allo"; } }