Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么int32.maxvalue+;一个长的?_C#_.net - Fatal编程技术网

C# 为什么int32.maxvalue+;一个长的?

C# 为什么int32.maxvalue+;一个长的?,c#,.net,C#,.net,如果将以下代码放入.NET 4.5应用程序中: public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1; 生成一个编译器错误,说明“在检查模式下,操作在编译时溢出”。我知道我可以把它放在一个“未检查”的块中,这样就可以了,但我的问题是,为什么错误会首先出现?很明显,long可以保存int的最大值加1 请注意,使用Int32和Int64而不是long和int似乎没有帮助。您的代码实际上如下所示: (long)(int.MaxVal

如果将以下代码放入.NET 4.5应用程序中:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;
生成一个编译器错误,说明“在检查模式下,操作在编译时溢出”。我知道我可以把它放在一个“未检查”的块中,这样就可以了,但我的问题是,为什么错误会首先出现?很明显,long可以保存int的最大值加1


请注意,使用Int32和Int64而不是long和int似乎没有帮助。

您的代码实际上如下所示:

(long)(int.MaxValue + 1)
但由于.NETFramework在int和long之间有一个内置的隐式转换,所以您不必在代码中显式地将转换为long

因此,首先执行这部分代码:

int.MaxValue + 1
此操作的结果是一个
int
值,该值会导致溢出异常。
因此,您的代码甚至没有机会开始从int到long的转换。

我认为这与在转换为
long
之前计算
int.MaxValue+1
的值有关。当然,long可以保存该值,但由于您正在进行整数加法,因此在进行转换之前,无法将
int.MaxValue+1
的整数值存储在int中。

请尝试

public const long MAXIMUM_RANGE_MAGNITUDE = (long)int.MaxValue + 1L;

这是因为赋值右侧的计算是以整数类型进行的。它是溢出整数

您可以通过以下方式解决此问题:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L
通过将至少一个操作数强制转换为long

得到错误的原因在C#规范中指定


对于二进制数+,–,*,/,%,&,^,|,=,!=,>,=,并将常量值转换为长值

public const long MAXIMUM_RANGE_MAGNITUDE = (long) int.MaxValue + 1;

它不会溢出很长一段时间;它溢出了一个int。当运行时计算它时,它会接受一个32位整数并向其中添加1。因此,唯一的方法是在未检查模式下执行此操作?回答得很好,我在您发布的代码上尝试了一些变体,但显然不是正确的变体!不过你的很好用。