不能隐式地将类型’long’转换为“int?”?

这是一个非常简单的问题 – 将类型长变量转换为Nullable int类型(int?)。 (见下面的例子 – 不是实际的代码)

int? y = 100; long x = long.MaxValue; y = x; 

我收到编译时错误。

“不能隐式地将类型’long’转换为’int?’。存在显式转换(你是否错过了转换?)。

我确实有修复(见下面的解决方案部分),我发布问题的好奇心是推荐的3个解决方案?

  y = Convert.ToInt32(x); y = (int)x; y = unchecked((int) x); 

提前感谢您的建议

您需要显式转换的原因是并非所有long值都可以表示为int 。 编译器或多或少地说“你可以做到这一点,但你必须告诉我你知道你在做什么”。

根据文档 ,如果long不能表示为int ,则Convert.ToInt32将检查并抛出OverflowException 。 您可以在参考源中看到实现 – 它只是这个检查然后是强制转换。

后两个选项(通常)是相同的,并允许转换,尽管溢出,因为unchecked 是编译器默认值 。 如果使用/ checked开关将编译器默认值更改为选中,那么如果不在unchecked块中,则会出现OverflowException

至于哪个是“最好的”,这取决于您的要求。

int是32位整数,而long是64位整数。

long可以存储/表示所有int值,但是所有long值都不能用int表示,所以long类型比int ,这就是为什么int可以通过编译器隐式转换为long而不是反之亦然。

所以这就是我们需要显式地转换/转换longint原因,如果long不能表示为int ,则可能导致信息丢失