这是一个非常简单的问题 - 将类型长变量转换为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);
提前感谢您的建议
答案 0 :(得分:4)
int
是32位整数,而long
是64位整数。
long
可以存储/代表所有int
值,但long
无法表示所有int
值,因此long
的类型大于int
这就是为什么int
可以被编译器隐式转换为long
但反之亦然。
这就是我们需要明确转换/转换long
到int
的原因,如果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
。
至于哪个最好',这取决于你的要求。