9

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

spot.ViewCount += 1;

仅当 ViewCount 属性的值不是 NULL(任何 int)时才有效。

为什么编译器会这样做?

我将不胜感激任何解决方案。

4

4 回答 4

11

Null不一样0。因此,不存在将 null 增加到 int 值(或任何其他值类型)的逻辑操作。例如,如果要将可为空的 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,它只是实现了将一个整数分配给一个可以为空的 int 值的效果,当它设置为 null 时)。

于 2013-07-30T09:37:32.580 回答
8

如果您查看编译器为您生成的内容,那么您将看到其背后的内部逻辑。

编码:

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 来获取此代码

于 2013-07-30T09:52:18.003 回答
1

因为可空类型已经提升了操作符。通常,这是 C# 中函数提升的特定情况(或者至少看起来是这样,如果我错了,请纠正我)。

这意味着任何操作null都会产生null结果(例如1 + nullnull * null等)

于 2013-07-30T09:39:57.977 回答
0

您可以使用这些扩展方法

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);
于 2017-12-06T18:35:26.570 回答