<分区>
通过在值类型数据类型上应用可空运算符改变了什么,现在它可以存储空值。
<分区>
通过在值类型数据类型上应用可空运算符改变了什么,现在它可以存储空值。
最佳答案
正如其他人所说,“?”只是将其更改为 Nullable<T>
的简写.这只是另一种带有 bool 标志的值类型,用于说明是否真的有有用的值,或者它是否是该类型的空值。换句话说,Nullable<T>
看起来有点像这样:
public struct Nullable<T>
{
private readonly bool hasValue;
public bool HasValue { get { return hasValue; } }
private readonly T value;
public T value
{
get
{
if (!hasValue)
{
throw new InvalidOperationException();
}
return value;
}
}
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
// Calling new Nullable<int>() or whatever will use the
// implicit initialization which leaves value as default(T)
// and hasValue as false.
}
显然在实际代码中有更多的方法(如 GetValueOrDefault()
)和转换运算符等。C# 编译器添加了 lifted 运算符,这些运算符有效地代理了 T
的原始运算符。 .
冒着听起来像破纪录的风险,这仍然是一种值(value)类型。它不涉及拳击......当你写的时候:
int? x = null;
那不是空引用 - 它是Nullable<int>
的空值,即hasValue
是false
.
当一个可为 null 的类型被装箱时,CLR 有一个特性,即值要么被装箱为一个空引用,要么是一个普通的装箱 T。所以如果你有这样的代码:
int? x = 5;
int y = 5;
object o1 = x;
object o2 = y;
o1
引用的盒装值和 o2
是无法区分的。您不能说一个是装箱可空类型的结果。
关于c# - ? C# 中的(可空)运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3183818/