可空非引用类型变量是否需要 new()?

Is new() required for nullable non-reference type variable?

如果我创建了一个非引用类型的变量,比如int,可为空,即int?,这是否意味着我需要在赋值之前使用构造函数?

通常我只是初始化一个非引用类型的变量

int foo = 5;

但是如果我有一个可为空的非引用数据类型变量是必要的初始化,如下所示,或者我仍然可以使用上面的简单初始化吗?

int? foo = new int();
foo = 5;

没有。您无需在分配前创建实例。 int? 是一个在赋值时创建的结构。

您的作业 foo = 5; 实际上是:

foo = new Nullable<int>(5);

这都是编译器完成的。无需自己动手。

int?Nullable<int> 的语法糖;至于 Nullable<T> 如果我们看一下它的实现

https://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e

我们会找到一个隐式运算符声明:

public struct Nullable<T> where T : struct
{
     ...

     [System.Runtime.Versioning.NonVersionable]
     public static implicit operator Nullable<T>(T value) {
         return new Nullable<T>(value);
     }

     ...
}

因此对于任何 struct T 而不是 explicit 构造函数调用

T value = ...

T? test = new Nullable<T>(value);

我们可以使用隐式运算符

T? test = value; // implicit operation in action

在您的特定情况下 Tint 我们有

int? foo = 5;