如果我做了一个非引用类型的变量,比如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;