[英]C# Nullable Types and the Value property
我有點不清楚何時/是否在獲取可空類型中包含的值時必須使用可空類型的Value
屬性。 考慮以下示例:
int? x = 10;
Console.WriteLine("The value of 'x' is " + x.Value);
Console.WriteLine("The value of 'x' is " + x);
這兩者都返回相同的值 (10)。
但是,如果我最初將x
設置為null
,第一個Console.WriteLine
會引發異常,而第二個則不會。
所以,我的問題是這個。 使用Value
屬性有什么意義? 似乎不需要獲取實際值(即使它是null
),如果值確實是null
,則會拋出異常。
它通常需要-只是沒有你的具體情況。 x
的類型是Nullable<int>
,而不是int
- 並且沒有從Nullable<T>
到T
隱式轉換。
不過,讓我們看看您的示例中發生了什么。 您的最后一行正在轉換為:
Console.WriteLine(string.Concat("The value of 'x' is ", x));
這是拳擊x
,這將導致無論是盒裝int
或空引用...這兩者都是通過處理string.Concat
。
當您不通過字符串連接轉換為字符串時,例如,如果您想要:
int nonNullable = x.Value;
那么你就必須使用Value
屬性-或有明確的轉換,也可能是空合並運算符,或一個電話GetValueOrDefault
:
int nonNullable = (int) x;
int alternative = x ?? 20;
int andAnother = x.GetValueOrDefault(20);
x
和x.Value
有不同的類型。
static void Meth(int i)
{
int? x = 5;
Meth(x);
Meth(x.Value);
}
第二行不編譯。
所以使用x.Value
原因很明顯——當你需要實際值時需要調用它。 而NullReferenceException
是合理的,因為null
不對應值類型的值。
如果 HasValue 屬性返回 true,您應該訪問 Value 屬性,否則您將收到異常。 您的示例有效,因為 Nullable 重載了 ToString() 方法,並且 C# 編譯器支持此類型的快捷方式。
當x
為空時x.Value
會拋出 System.InvalidOperationException 異常(不管 x 的類型是什么)
string + null = string
:也不例外
如果您想將 .value 用於可為空的 int。 你可以像這樣檢查值
int? x = null;
int valXX = x.HasValue ? x.Value : 0;
Console.WriteLine("The value of 'x' is ->" + x + "<-");
Console.WriteLine("The value of 'valXX' is ->" + valXX + "<-");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.