【问题标题】:Nullable<long> is not Nullable<long> after assignment from long [duplicate]从 long [重复] 分配后,Nullable<long> 不是 Nullable<long>
【发布时间】:2021-04-28 11:19:22
【问题描述】:

我在原语上的可为空值出现意外行为。

我的测试代码:

Nullable<long> value = long.Parse("5");
Type type = value.GetType();
// at this Point type is System.Int64 and not Nullable<System.Int64>

是否有任何可能性,value 保持 Nullable&lt;System.Int64&gt; 并且不会转换为常规 long

【问题讨论】:

  • long.Parse 返回 long,而不是 long? - 总是。所以答案肯定是:不。你为什么还要使用long?
  • 好吧,long.Parse 返回 long 而不是 long? - 所以变量 的实际内容是 long。话虽这么说:如果您重视 null,那么无论如何您都不能调用.GetType()
  • 井值被强类型为 Nullable。我希望在声明之后使用 Nullable 而不是很长。
  • 查看this 文档以阅读如何识别可空值类型

标签: c# .net nullable


【解决方案1】:

当您查看 docs long.Parse 时返回 long,而不是 long?

public static long Parse (string s);

您当然可以将其转换long?,但这不会改变该声明。

long a = long.Parse("5");
Nullable<long> n = a; // convert to long?

所以简而言之,long.Parse 不会永远返回与 long 不同的东西。即使您提供了一些无效的输入:

long a = long.Parse("Hello"); //throws FormatException

在你的变量上调用GetType 会给你运行时-类型,而不是编译时类型。由于Parse 在运行时返回longGetType 肯定也会这样做。

【讨论】:

  • 这是错误的。它被分配给long?
  • @Charlieface 当然可以,但在我们分配它之前,我们必须转换它。
  • 好的,但你没有解释为什么GetType返回long而不是long?
  • @Charlieface 看我最后的声明...
  • @ArndtBieberstein 是的,GetType 将始终为您提供 的类型,无论您在 编译时如何声明它。
【解决方案2】:

没有。您已将其分配给 long? 变量。

当您调用GetType() 时,此函数在System.Object 上定义。因此,要调用它,我们必须将值装箱。

您可以通过查看为 GetType() 调用生成的 MSIL 指令来看到这一点:
box System.Nullable&lt;System.Int64&gt;
call System.Object.GetType
因此,当它被装箱时,它实际上会将long? 推入堆栈,而装箱只给我们一个装箱的long

因此,在可为空的情况下,结果值是基本类型(请参阅herehere)。

在这种情况下,无论如何都没有理由打电话给GetType,因为我们知道这是long?

【讨论】:

  • 当你调用 GetType() 时,这个函数是在 System.Object 上定义的。因此,要调用它,我们必须将值装箱。 这是不直观的,即使我完全理解它,并且理解它为什么会发生,它仍然是不直观的:-)
  • 100% 同意,Nullable&lt;&gt;(和一般的 valuetype)语义留下了所需要的东西
  • “因为我们知道它很长?”不,它不是long? - 至少不是在运行时,GetType 将涵盖。
  • @HimBromBeere 赋值给long? 变量后是long?。然后将其随后装箱,将其转换回已装箱的long
  • 5 不是 long?,但它是 可分配 的。所以不,该值仍然是long。您在运行时声明变量的方式与它包含的内容之间存在巨大差异 - *这就是GetType 将涵盖的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2015-01-07
  • 1970-01-01
相关资源
最近更新 更多