我正在寻找在C#中使用??
运算符(空合并运算符)。但MSDN上的documentation是有限的。如果左操作数到?运算符不为null,右操作数是否得到评估?
我的问题:如果左边的操作数不为null,右边的操作数是否得到评估?
我正在寻找在C#中使用??
运算符(空合并运算符)。但MSDN上的documentation是有限的。如果左操作数到?运算符不为null,右操作数是否得到评估?
我的问题:如果左边的操作数不为null,右边的操作数是否得到评估?
与以往一样,在C#规范去为这种事情的最佳场所。
从C# 5 specification(重点煤矿)第7.13:
空聚结形式的
a ?? b
表达式需要a
是一个空类型或引用类型。如果a
非空,则a ?? b
的结果为a
;否则,结果是b
。 仅当a
为空时,操作才会评估b
。
有关执行任何转换时的详细信息以及确切的行为,但这是您提出问题的要点。值得注意的是,空合并运算符是右联合的,所以a ?? b ?? c
被评估为a ?? (b ?? c)
...这意味着它将仅评估c
如果都a
和b
为空。
谢谢从来没有想过检查规范 – 2014-09-24 19:04:22
@AararrByrd:*总是*检查规范:) C#规范是最好的书面之一我'已经见过,而且它是这类事情的权威来源。 – 2014-09-24 19:22:01
这个操作符的关联性是否对其行为有实际影响?我试图想一个案例,其中'(a ?? b)?? c'会表现不同于'a? (b ?? c)',我想不出一个。 – JLRishe 2016-05-17 13:13:42
为什么不考吧:)
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
...第二个价值没有得到评估
检查了这一点。如果名称不为空,则控制台显示“MyName”。如果它是零,控制台显示“调用”,然后“异体”
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";
}
}
从规范:
形式的的空合并表达?? b要求a是可空类型或引用类型。如果a是非空的,则结果为?? b是a;否则,结果是b。 仅当a为空时,操作才会评估b。
(强调)
试一试:'string s =“A”; Console.WriteLine(“Hello”?? a.Substring(10));' – phoog 2014-09-24 18:56:39