使用“?”使值类型变量可为空:是否意味着装箱?

Making value type variables nullable by using "?": does it imply boxing?

在 C# 中给出以下假设:

  1. 装箱和拆箱让我可以将任何值类型变量转换为对象类型,这是一种引用类型(因此它也可以为空),如示例所示:
int i = 123;
object box = i;
  1. 那个“?”运算符让我将不可为 null 的整数转换为可为 null 的变量,如示例所示:

int? n = 0;

我的问题:只有引用类型变量可以为空,我可以说在第二个示例中我正在做隐式装箱吗?换句话说,当我使用“?”运算符使可为空的整数时,是否存在装箱 操作也是隐含的(即使它不是明确的)?

int?Nullable<T> See documentation 的糖。如果我们看一下它的签名,我们会看到:

public struct Nullable<T> where T : struct
{
...
    public override bool Equals(object other)
    {
      if (!this.hasValue)
        return other == null;
      return other != null && this.value.Equals(other);
    }

因为它是一个结构,所以值不会被装箱。

如果您需要比较值,n.Equals(1) 会导致参数装箱。我找不到任何关于相等运算符 == 的文档,但我认为假设它不应该导致装箱是相当安全的。