如果您将以下代码放在.NET 4.5应用程序中:
public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;
Run Code Online (Sandbox Code Playgroud)
生成编译器错误,指出"操作在编译模式下在编译时溢出".我知道我可以把它放在一个"未经检查"的块中并且没问题,但我的问题是为什么错误出现在第一位?很明显,long可以保持int的最大值加1.
请注意,使用Int32和Int64而不是long和int似乎没有帮助.
Hab*_*bib 17
这是因为赋值右侧的计算是以整数类型完成的.它是溢出整数
你可以解决这个问题:
public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L
Run Code Online (Sandbox Code Playgroud)
通过将至少一个操作数转换为long
您收到错误的原因在C#规范中指定.
对于二进制+, - ,*,/,%,&,^,|,==,!=,>,<,> =和<=运算符,操作数转换为类型T,其中T是第一个int,uint,long和ulong ,可以完全表示两个操作数的所有可能值.然后使用类型T的精度执行操作,结果的类型是T(或关系运算符的bool).不允许一个操作数为long类型,另一个操作数为binary类型的二元运算符.
在您的情况下,因为两个加法操作数都可以表示,int因此计算以整数类型完成.显式地转换其中一个操作数long将导致long结果,因此没有溢出错误.
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |