2013-07-30 98 views
3

我有一個整型的頁面計數器類型?:爲什麼空值int(int?)如果值爲NULL,不會通過「+ =」增加值?

spot.ViewCount += 1; 

它只能如果收視次數屬性的值是NOT NULL(任何INT)。

編譯器爲什麼這樣做?

我將不勝感激任何解決方案。

+5

你覺得呢'NULL + 1'應該是什麼? – wudzik

+0

我相信在http://stackoverflow.com/questions/1327917/system-nullablet-what-is-the-value-of-null-int-value?rq=1的答案几乎可以回答這個問題。 –

+0

給wudzik:年!你是對的 - 沒有什麼...謝謝 – Pal

回答

5

如果你看看什麼編譯器已經爲你,那麼你會看到背後的內在邏輯。

代碼:

int? i = null; 
i += 1; 

其實就是threated像:

int? nullable; 
int? i = null; 
int? nullable1 = i; 
if (nullable1.HasValue) 
{ 
    nullable = new int?(nullable1.GetValueOrDefault() + 1); 
} 
else 
{ 
    int? nullable2 = null; 
    nullable = nullable2; 
} 
i = nullable; 

我用JustDecompile得到這個代碼

8

Null0不一樣。因此,沒有邏輯操作會將null增加到int值(或任何其他值類型)。例如,如果您想將null的int值從0增加到1,則可以這樣做。

int? myInt = null; 
myInt = myInt.HasValue ? myInt += 1 : myInt = 1; 

//above can be shortened to the below which uses the null coalescing operator ?? 
//myInt = ++myInt ?? 1 

(不過請記住,這不是增加null,它只是實現分配給當它被設置爲空可爲空的int值一個整數的效果)。

+2

'myInt = ++ myInt? 1' – KappaG3

+1

我只是想明確說明'HasValue'方面,但你是對的,那會更好:) – keyboardP

-1

您可以使用這些擴展方法

public static int? Add(this int? num1, int? num2) 
{ 
    return num1.GetValueOrDefault() + num2.GetValueOrDefault(); 
} 

用法:

spot.ViewCount = spot.ViewCount.Add(1); 

甚至:

int? num2 = 2; // or null 
spot.ViewCount = spot.ViewCount.Add(num2); 
+0

你不需要編寫自定義擴展方法來獲得可爲空的值,或者它是默認值如果沒有價值,則爲價值。 'Nullable'已經有了'GetValueOrDefault'方法。 – Servy

+0

@Serv好點,我改變了。然而,定義另一種擴展方法並不是錯誤,尤其是不值得投票。 – Jacob

相關問題