2014-09-24 47 views

回答

27

與以往一樣,在C#規範去爲這種事情的最佳場所。

C# 5 specification(重點煤礦)第7.13:

空聚結形式的a ?? b表達式需要a是一個空類型或引用類型。如果a非空,則a ?? b的結果爲a;否則,結果是b僅當a爲空時,操作纔會評估b

有關執行任何轉換時的詳細信息以及確切的行爲,但這是您提出問題的要點。值得注意的是,空合併運算符是右聯合的,所以a ?? b ?? c被評估爲a ?? (b ?? c) ...這意味着它將僅評估c如果ab爲空。

+0

謝謝從來沒有想過檢查規範 – 2014-09-24 19:04:22

+9

@AararrByrd:*總是*檢查規範:) C#規範是最好的書面之一我'已經見過,而且它是這類事情的權威來源。 – 2014-09-24 19:22:01

+0

這個操作符的關聯性是否對其行爲有實際影響?我試圖想一個案例,其中'(a ?? b)?? c'會表現不同於'a? (b ?? c)',我想不出一個。 – JLRishe 2016-05-17 13:13:42

11

爲什麼不考吧:)

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 ...第二個價值沒有得到評估

2

檢查了這一點。如果名稱不爲空,則控制檯顯示「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"; 
    } 
} 
4

從規範:

形式的的空合併表達?? b要求a是可空類型或引用類型。如果a是非空的,則結果爲?? b是a;否則,結果是b。 僅當a爲空時,操作纔會評估b。

(強調)

相關問題