为什么可以为null的int(int?)没有';t通过“+=";如果该值为NULL

本文关键字:int 通过 quot 如果 NULL 为什么 没有 null | 更新日期: 2023-09-27 18:25:31

我有一个int?类型的页面计数器:

spot.ViewCount += 1;

只有当ViewCount属性的值为NOT NULL(任意int)时,它才有效。

编译器为什么这么做?

如果有任何解决方案,我将不胜感激。

为什么可以为null的int(int?)没有';t通过“+=";如果该值为NULL

Null0不同。因此,不存在将null增加为int值(或任何其他值类型)的逻辑运算。例如,如果要将可为null的int的值从null增加到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,但它只是实现了在将整数设置为null时将其分配给可为null的int值的效果)。

如果您了解编译器为您生成了什么,那么您将看到背后的内部逻辑。

代码:

int? i = null;
i += 1;

实际上被威胁为:

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的类型已经提升了运算符。一般来说,这是C#中函数提升的一个特殊情况(或者至少看起来是这样,如果我错了,请纠正我)。

这意味着任何使用null的操作都将具有null结果(例如1 + nullnull * 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);