2011-03-23 90 views
13

我有點不清楚何時/如果必須使用可空類型的Value屬性獲取可空類型中包含的值。考慮下面的例子:C#可爲空類型和值屬性

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,則會拋出異常。

回答

20

通常需要 - 只是不在你的具體情況。 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); 
+1

或者可能x.GetValueOrDefault(20),但是空合併顯然很好,不知道這是可能的。 – jishi 2011-03-23 13:32:03

+0

@jishi:不錯的選擇,我會在那裏添加它。 – 2011-03-23 13:34:29

5

xx.Value有不同的類型。

static void Meth(int i) 
    { 
     int? x = 5; 
     Meth(x); 
     Meth(x.Value); 
    } 

第二行不編譯。

所以使用x.Value的原因很明顯 - 您需要在需要實際值時調用它。而NullReferenceException是合理的,因爲null不對應價值類型的值。

+0

但是你可以有'Meth((int)x);'它會被編譯。 :) – 2011-03-23 13:34:11

+2

@Shadow Wizard'(int)x'與'x.Value' – Andrey 2011-03-23 13:41:04

0

如果HasValue屬性返回true,那麼您應該訪問Value屬性,否則您將得到一個異常。 您的示例工作原因是Nullable重載了ToString()方法,並且C#編譯器支持此類型的快捷方式。

0

x爲空時x.Value會拋出一個System。InvalidOperationException異常(不管是x的類型)

string + null = string:未見異常

0

如果你想使用.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 + "<-");