通过在值类型数据类型上应用可空运算符可以更改的内容现在可以存储null。
答案 0 :(得分: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.
}
显然,在实际代码中有更多方法(如GetValueOrDefault()
)和转换运算符等.C#编译器添加提升运算符,它们有效地代理{{1}的原始运算符}。
冒着听起来像破纪录的风险,这仍然是一种价值类型。它不涉及拳击......当你写:
T
这不是null 引用 - 它是int? x = null;
的空值,即Nullable<int>
为hasValue
的那个。
当一个可空类型被包装时,CLR有一个特性,即该值被装箱为空引用,或者是一个普通的盒装T.所以,如果你有这样的代码:
false
int? x = 5;
int y = 5;
object o1 = x;
object o2 = y;
和o1
引用的盒装值无法区分。你不能说这是拳击可以为空的类型的结果。
答案 1 :(得分:5)
?
语法是Nullable<T>
结构的语法糖。
实质上,当您编写int? myNullableInt
时,编译器会将其更改为Nullable<int> myNullableInt
。
从MSDN(向下滚动到“Nullable Types Overview”):
语法T?是Nullable的简写,其中T是值类型。这两种形式是可以互换的。
答案 2 :(得分:3)
值类型本身没有任何改变,它只是包含在System.Nullable<T>
结构中。
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
答案 3 :(得分:1)
类型从以前变为Nullable类型。
如果你有一个int,并决定把它变成一个int?:
int myInt;
你做到了:
int? myInt;
现在是:
Nullable<int> myInt;
实际上。
答案 4 :(得分:-3)
在基本术语中,可空类型是普通类型的盒装版本,其上有一个名为hasValue的额外布尔字段。 当此字段设置为false时,实例为空。
查看此答案以获取有关CLR实施的更多详细信息,以及他们为何可能选择它:Boxing / Unboxing Nullable Types - Why this implementation?