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 在运行时是 long
,GetType
肯定也是。
我对原语可空值有意外行为。
我的测试代码:
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 thelong?
on the stack, and the boxing only gives us a boxedlong
因此,在可为 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 在运行时是 long
,GetType
肯定也是。