可空非引用类型变量是否需要 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
在您的特定情况下 T
是 int
我们有
int? foo = 5;
如果我创建了一个非引用类型的变量,比如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
在您的特定情况下 T
是 int
我们有
int? foo = 5;