【问题标题】:How can I initialize a System.Nullable<Int32>? [duplicate]如何初始化 System.Nullable<Int32>? [复制]
【发布时间】:2021-03-25 11:47:15
【问题描述】:

我需要一个 Nullable 类型,但如何初始化这样的变量?每当我尝试这样做时,它都会自动转换为普通的 Int32。

Nullable<Int32> nullableInt32 = new Nullable<Int32>(3);
Console.WriteLine(nullableInt32.GetType()); // gives me System.Int32

这是一个错误吗?我如何才能真正初始化 Nullable?

【问题讨论】:

  • int? nullableInt32 = 3 是一种更快的方式来编写您需要的内容...)。这里有趣的部分是GetType() 将它调用的值类型装箱(因为它是在object 上定义的非虚拟方法),而Nullable&lt;int&gt; 将普通int 装箱。所以GetType 最终被一个装箱的int 调用,因此返回int。这只是GetType 的一个恼人的副作用:你正确地初始化了Nullable&lt;int&gt;

标签: c# .net


【解决方案1】:

来自Microsoft's documentation

如果要判断一个实例是否为可空值类型,请不要使用 Object.GetType 方法获取要使用上述代码测试的 Type 实例。当您对可为空值类型的实例调用 Object.GetType 方法时,该实例被装箱为 Object。由于对可空值类型的非空实例进行装箱等效于对基础类型的值进行装箱,因此 GetType 返回一个表示可空值类型的基础类型的 Type 实例。

所以你的int? 被装箱到int,并且GetType() 在装箱的实例上被调用。

除非您在编译时知道类型并使用typeof,否则无法获取可为空对象的类型:

var type = typeof(int?);

实际上这无关紧要,因为如果您在编译时不知道类型,则意味着您正在使用某种类型的擦除(即强制转换为对象),这意味着装箱和可为空的值那里不存在类型。您不能使用多态性,因为它不适用于值类型。

如果您认为自己对此有正当需求,请随时在 cmets 中解释您的用例。

【讨论】:

  • ("没有办法获得可空对象的类型"——严格来说,你可以做类似typeof(int?).GetGenericTypeDefinition().MakeGenericType(someType) 这样的事情,但就像你说的,为什么要你?)
  • 出于某种特殊原因,为什么希望有可空类型的实例检查大量类似的问题,例如stackoverflow.com/questions/5644587/… - 在获得属性类型后,将其与手头的值进行比较比挖掘更容易输入类型...
猜你喜欢
  • 2021-08-03
  • 2011-10-11
  • 2019-10-23
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多