不能隐式地将类型’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
而不是反之亦然。
所以这就是我们需要显式地转换/转换long
到int
原因,如果long
不能表示为int
,则可能导致信息丢失
- 表格/窗口后面出现的工具提示! (C#/ VS 2008)
- 在运行时期间动态地向TableLayoutPanel添加控件
- 如何将C#类转换为XMLElement或XMLDocument
- 如何将不可见的ViewModel添加到MvvmCross中的导航堆栈
- c#中的unsigned char **等价物,必须在文件中写入返回值
- Silverlight和WCF:NotFound错误!
- 我如何根据用户输入在LINQ中使用OrderBy和ThenBy?
- 如何使用NewtonSoft JsonConvert在其名称中用短划线(“ – ”)反序列化属性?
- Lucene.Net – IndexWriter.SetMergedSegmentWarmer