Nullable<long> 在 long 赋值后不是 Nullable<long>

Nullable<long> is not Nullable<long> after assignment from long

我对原语可空值有意外行为。

我的测试代码:

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

有没有可能 value 保持 Nullable<System.Int64> 而不会转换为常规 long

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

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

You can see this by viewing the generated MSIL instructions for the GetType() call:
box System.Nullable<System.Int64>
call System.Object.GetType
So when it is boxed it actually pushes the long? on the stack, and the boxing only gives us a boxed long

因此,在可为 null 的情况下,结果值是基本类型(参见 here and here)。

在这种情况下,无论如何都没有理由调用 GetType,因为我们知道它是一个 long?

当你查看 docs long.Parse return 时 long,而不是 long?.

public static long Parse (string s);

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

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

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

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

在变量上调用 GetType 将为您提供 运行时 类型,而不是编译时类型。由于 Parse return 在运行时是 longGetType 肯定也是。