对于可为空的非引用类型变量,new() 是必需的



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

通常要初始化非引用类型变量,我只是这样做

int foo = 5;

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

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

No.您无需在分配之前创建实例。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);
     }
     ...
}

所以对于任何结构T而不是显式构造函数调用

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

我们可以使用隐式运算符

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

在您的特定情况下T int,我们有

int? foo = 5;

最新更新