我正在尋找在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