一尘不染

可空类型不是可空类型吗?

c#

我正在使用可空类型进行一些测试,但并没有达到我的预期:

int? testInt = 0;
Type nullableType = typeof(int?);
Assert.AreEqual(nullableType, testInt.GetType()); // not the same type

这也不起作用:

DateTime? test = new DateTime(434523452345);
Assert.IsTrue(test.GetType() == typeof(Nullable)); //FAIL

DateTime? test = new DateTime(434523452345);
Assert.IsTrue(test.GetType() == typeof(Nullable<>)); //STILL FAIL

我的问题是为什么testInt.GetType()返回int,而typeof(int?)返回真正的可空类型?


阅读 202

收藏
2020-05-19

共1个答案

一尘不染

根据MSDN

在将类型隐式转换为Object时,对Nullable类型调用GetType会导致执行装箱操作。因此,GetType总是返回代表基础类型的Type对象,而不是Nullable类型。

当您将可为空的对象装箱时,仅将基础类型装箱。

同样,从MSDN

将非null的可为空的值类型装箱,将值类型本身而不是包装该值类型的System.Nullable装箱。

2020-05-19