如果左操作数到?? operator不为null,是否对右操作数进行求值?
我正在寻找使用??
C#中的operator(null-coalescing operator)。 但是MSDN上的文档是有限的。
我的问题:如果左侧操作数不为null,右手操作数是否会被评估?
与以往一样,C#规范是这类事情的最佳选择。
从C#5规范的第7.13节(强调我的):
一个空的合并表达forms
a ?? 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)
…这意味着如果a
和b
都为空,它只会评估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"; } }