2013-07-30 66 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

相关问题