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

时间:2015-06-01 17:01:01

标签: c# types long-integer nullable

这是一个非常简单的问题 - 将类型长变量转换为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);  

提前感谢您的建议

2 个答案:

答案 0 :(得分:4)

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

long可以存储/代表所有int值,但long无法表示所有int值,因此long的类型大于int这就是为什么int可以被编译器隐式转换为long但反之亦然。

这就是我们需要明确转换/转换longint的原因,如果long无法表示为int

答案 1 :(得分:3)

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

如果Convert.ToInt32无法表示为OverflowException,则每the docs long会检查并抛出int。您可以在reference source中查看实施情况 - 只需进行此检查,然后进行演员投放。

后两个选项(通常)是相同的,并且尽管有unchecked is the compiler default溢出,但允许播放。如果您将编译器默认值更改为选中using the /checked switch,那么如果不在OverflowException块中,您将获得unchecked

至于哪个最好',这取决于你的要求。