首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >长时间赋值后,Nullable<long>不是Nullable<long>

长时间赋值后,Nullable<long>不是Nullable<long>
EN

Stack Overflow用户
提问于 2021-01-24 13:58:15
回答 2查看 246关注 0票数 3

对于原语,我有一种意想不到的行为。

我的测试代码:

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-24 14:06:17

当您查看文档 long.Parse返回long时,不会看到long?

代码语言:javascript
运行
复制
public static long Parse (string s);

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

代码语言:javascript
运行
复制
long a = long.Parse("5");
Nullable<long> n = a; // convert to long?

因此,简而言之,long.Parse绝不会让返回与long不同的东西。即使您提供了一些无效的输入:

代码语言:javascript
运行
复制
long a = long.Parse("Hello"); //throws FormatException

对变量调用runtime-type,,而不是编译时的GetType。当Parse在运行时返回一个long时,GetType当然也会返回。

票数 0
EN

Stack Overflow用户

发布于 2021-01-24 14:05:38

不是的。您已经将它分配给了一个long?变量。

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

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

因此,在可空的情况下,结果值是基类型(请参见这里这里)。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65871442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档