2013-04-01 72 views
3
var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount : 
       (i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount : 
       definition.AdditionalPetDiscount; 

你能給我一個這段代碼的解釋嗎?我知道三元操作符。但上述不是那樣的。有條件的操作符?

正常三元操作是這樣的:

PaidDate = (paidDate == null ? DateTime.Now : paidDate); 
+2

您是否閱讀過文檔http://msdn.microsoft.com/en-us/library/ms173224.aspx? –

+4

這是多個「條件」和「空合併」運算符的組合。只需添加括號,直到它有意義:) –

+0

僅供參考它正確地稱爲條件運算符不是三元運算符 –

回答

6

?:是三元運算符。 ??是空合併運算符。它用於返回非空的第一個表達式。

您發佈的代碼段正在使用這兩種操作符。它等效於以下if/else結構:

if (i == 1) 
{ 
    if (definition.SecondPetDiscount != null) 
    { 
     discount = definition.SecondPetDiscount; 
    } 
    else 
    { 
     discount = definition.AdditionalPetDiscount; 
    } 
} 
else if (i == 2) 
{ 
    if (definition.ThirdPetDiscount != null) 
    { 
     discount = definition.ThirdPetDiscount; 
    } 
    else 
    { 
     discount = definition.AdditionalPetDiscount; 
    } 
} 
else 
{ 
    discount = definition.AdditionalPetDiscount; 
} 

在該片段他們多次三元操作串聯起來。將多個空合併操作鏈接在一起有時也是有用的,例如, var foo = a ?? b ?? c

+0

感謝您的詳細解釋。 – Sampath

4

這是一個在C#中的空合併運算符。這是返回左側(如果左側不爲空),否則返回右側

+0

+1支持。 – Sampath

2

我想你混淆了空合併運算符的快捷方式,或??

definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount 

這意味着如果definition.ThirdPetDiscount爲空,則比使用definition.AdditionalPetDiscount

圍繞它的三元運算符就像一個常規的三元運算符。空合併運算符只是嵌套在它內部,並且還有一個三元運算符嵌套在第二個三元運算符中

+0

+1支持。 – Sampath

4

這是一個混合。

在本聲明中,有兩個條件(三元)操作以及null coalescing操作符。

第一個三元操作的第二個「選項」是整個三元操作本身。

+0

+1支持。 – Sampath

0
var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount : 
       (i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount : 
       definition.AdditionalPetDiscount; 

當然,(bool) ? code : code模式轉換爲if-else塊。

所以我們得到

var discount; 
if(i==1) 
{ 
    discount = definition.SecondPetDiscount ?? definition.AdditionalPetDiscount; 
} 
else if(i==2) 
{ 
    discount = definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount; 
} 
else 
{ 
    discount = definition.AdditionalPetDiscount; 
} 

object ?? object是空合併三元運算符。它所做的是將合併中的第一個非空對象並將其返回。列表中可以有任意數量的對象。

所以這裏的var discount設置爲definition.AdditionalPetDiscount如果第二或第三寵物折扣爲空,或者如果我不爲1或2

0

如果我是1,那麼折扣將被設置爲definition.SecondPetDiscount除非爲空,在這種情況下,它將被設置爲definition.AdditionalPetDiscount。

如果我是2,那麼折扣將被設置爲definition.ThirdPetDiscount,除非它爲null,在這種情況下,它將被設置爲definition.AdditionalPetDiscount。

如果我既不是1也不是2,那麼它將被設置爲definition.AdditionalPetDiscount。