我有一個整型的頁面計數器類型?:爲什麼空值int(int?)如果值爲NULL,不會通過「+ =」增加值?
spot.ViewCount += 1;
它只能如果收視次數屬性的值是NOT NULL(任何INT)。
編譯器爲什麼這樣做?
我將不勝感激任何解決方案。
我有一個整型的頁面計數器類型?:爲什麼空值int(int?)如果值爲NULL,不會通過「+ =」增加值?
spot.ViewCount += 1;
它只能如果收視次數屬性的值是NOT NULL(任何INT)。
編譯器爲什麼這樣做?
我將不勝感激任何解決方案。
如果你看看什麼編譯器已經爲你,那麼你會看到背後的內在邏輯。
代碼:
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得到這個代碼
Null
與0
不一樣。因此,沒有邏輯操作會將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值一個整數的效果)。
因爲可以爲空的類型have lifted operators。通常,在C#中使用it's a specific case of function lifting(或者至少它看起來是這樣,如果我錯了,請糾正我)。
這意味着,null
任何操作都會有null
結果(例如1 + null
,null * null
等)
您可以使用這些擴展方法:
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);
你覺得呢'NULL + 1'應該是什麼? – wudzik
我相信在http://stackoverflow.com/questions/1327917/system-nullablet-what-is-the-value-of-null-int-value?rq=1的答案几乎可以回答這個問題。 –
給wudzik:年!你是對的 - 沒有什麼...謝謝 – Pal