簡體   English   中英

?? 的用法可空之間<int>和字符串

[英]Usage of ?? between Nullable<int> and string

看着?? 定義它說當應用程序返回左操作數時,如果它不為空或右操作數。 但是為什么這不起作用?

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

是否要求可空類型與正確的操作數類型匹配?

?? 是以下邏輯語句的語法糖(在這種情況下)。

int? i = null;
string s = null;

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

顯然,編譯器永遠不會接受它,它也不會編譯,因為 i 不能隱式轉換為 s。 編譯器不會對空合並運算符進行例外處理,並且會強制執行類型要求。

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

您不能簡單地調用i.ToString()因為如果i為空,這將返回一個空字符串而不是 null,從而導致將空字符串分配給s而不是“某個字符串”。 因此,您將需要類似於以下通用擴展方法的內容:

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將被分配值“某個字符串”,因為擴展方法將正確保留可空值,允許空合並運算符選擇非空替代。


從 C# 6 開始,您可以使用Null Propagation Operator來簡化賦值,而無需使用擴展方法。

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

在上面, i被檢查為空,如果不是空, .ToString()被調用並分配結果。 否則, i被評估為 null 這導致 null 合並運算符優先並且“某個字符串”被分配給s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM