我总是使用(a)Nullable<>.HasValue因为我喜欢语义.然而,最近我正在研究其他人现有的代码库,他们Nullable<> != null专门使用(b)代替.是否有理由使用一个而不是另一个,还是纯粹的偏好?
(一个)
int? a;
if (a.HasValue)
// ...
Run Code Online (Sandbox Code Playgroud)
(b)中
int? b;
if (b != null)
// ...
Run Code Online (Sandbox Code Playgroud) 您是否尝试过使用该Convert.ChangeType()方法将值转换为Nullable<T>类型?尴尬的是,它会抛出InvalidCastException一句话:"空对象无法转换为值类型".
尝试在您的即时窗口上运行此操作: ?System.Convert.ChangeType(null, typeof(int?))
出于某些不明原因,Nullables被认为是价值类型.例如,typeof(int?).IsValueType退货true.
对我来说,自从Nullable<T>接受以来null,它是类类型,而不是值类型.有谁知道为什么它会以不同的方式实施?
class C<T> where T : struct {
bool M1(object o) => o is T;
bool M2(object o) => o is T?;
}
Run Code Online (Sandbox Code Playgroud)
传递null引用或盒装T值时,上述两种方法似乎表现相同.但是,生成的MSIL代码有点不同:
.method private hidebysig instance bool M1(object o) cil managed {
.maxstack 8
IL_0000: ldarg.1
IL_0001: isinst !T
IL_0006: ldnull
IL_0007: cgt.un
IL_0009: ret
}
Run Code Online (Sandbox Code Playgroud)
VS
.method private hidebysig instance bool M2(object o) cil managed {
.maxstack 8
IL_0000: ldarg.1
IL_0001: isinst valuetype [mscorlib]System.Nullable`1<!T>
IL_0006: ldnull
IL_0007: cgt.un
IL_0009: ret
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,o is …
有一个Nullable<T>结构,还有另一个静态Nullable类,有三个静态方法.
我的问题是,为什么静态Nullable类中的这些静态方法不能进入Nullable<T>struct?在两种不同类型中定义它们的原因是什么?
还有一个INullable界面.它做什么?
Nullable是一个结构.我知道结构不能被指定为"空".那么我们如何才能将Nullable的对象赋给null呢?是什么原因?