2015-06-04 36 views
5
之間

查看??定義,它說什麼時候應用返回左操作數,如果它不是null或右操作數。但爲什麼這不起作用?用法在Nullable <int>和字符串

int? i = null; 
string s = i ?? "some string"; 

是否需要可空類型與右操作數類型匹配?

+0

你可以具體說明發生了什麼事情與你期望發生的事情嗎? – BSMP

+3

如果'i'不是'null'會怎麼樣?你知道,'int'不能被分配給'string'。 – Dmitry

回答

7

??對於下面的邏輯語句是一個語法糖(在這種情況下)。

int? i = null; 
string s = null; 

if (i != null) 
{ 
    s = i; 
} 
else 
{ 
    s = "some string"; 
} 

顯然,編譯器永遠不會接受這個,它不會編譯,因爲我不能被隱式轉換爲s。編譯器不會爲空合併運算符制定例外規則,並強制執行類型要求。

如果您絕對希望能夠在單行中爲混合類型使用空合併運算符,則需要通過另一種方法執行類型轉換。

不能簡單地調用i.ToString(),因爲如果i爲空,將返回空字符串而不是空字符串,從而導致將空字符串分配給s而不是「some string」。因此,你需要像下面這樣的通用擴展方法:

public static string ToNullableString<T>(this Nullable<T> nullable) where T : struct 
{ 
    return nullable == null ? null : nullable.ToString(); 
} 

它可以用來像這樣:

int? i = null; 
string s = i.ToNullableString() ?? "some string"; 

s將被分配值「一些字符串」,因爲擴展方法會正確地保留可空值,從而允許空合併運算符選擇非空替代。

+0

感謝您的解釋。 –

+0

@DanielJabsøn不客氣:)。如果它對你有所幫助,一個被接受的答案總是不勝感激。 –

相關問題