Jon*_*eet 20
正如其他人所说,"?" 只是改变它的简写Nullable<T>
.这只是另一个带有布尔标志的值类型,用于表示是否确实存在有用的值,或者它是否为该类型的空值.换句话说,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.
}
Run Code Online (Sandbox Code Playgroud)
显然,在实际代码中有更多的方法(如GetValueOrDefault()
)和转换运算符等.C#编译器添加了提升的运算符,它们有效地代理了原始运算符T
.
听起来像是破纪录的风险,这仍然是一种价值类型.它不涉及拳击...当你写:
int? x = null;
Run Code Online (Sandbox Code Playgroud)
这不是一个空引用 - 它是null值Nullable<int>
,即hasValue
is的值false
.
当一个可以为空的类型被装箱时,CLR有一个特征,即该值被装箱为空引用,或者是一个普通的盒装T.所以如果你有这样的代码:
int? x = 5;
int y = 5;
object o1 = x;
object o2 = y;
Run Code Online (Sandbox Code Playgroud)
称为盒装值由o1
和o2
是无法区分的.你不能说这是拳击可空类型的结果.
该?
语法是语法糖的Nullable<T>
结构.
实质上,当您编写时int? myNullableInt
,编译器会将其更改为Nullable<int> myNullableInt
.
从MSDN(向下滚动到"Nullable Types Overview"):
语法T?是Nullable的简写,其中T是值类型.这两种形式是可以互换的.
归档时间: |
|
查看次数: |
8876 次 |
最近记录: |