我收到此错误
System.OverflowException: Arithmetic operation resulted in an overflow.
当我在 .Net 2.0 或更高版本 (.Net 4.0) 编译的 Windows Server 2008 R2 标准上运行我的应用程序时。据我所知,如果 C# 在没有/checked 参数的情况下编译,则应忽略算术溢出。在我的应用程序中,有很多地方可能发生溢出,所以我需要忽略它。
我追溯了一个例子:
using System;
namespace ArithmeticOverflow
{
class Program
{
static void Main( string[] args )
{
GetTypeID( typeof( Program ) );
}
public static int GetTypeID( Type type )
{
return type.GetHashCode() ^ type.FullName.GetHashCode() ^ type.TypeHandle.Value.ToInt32();
}
}
}
使用 .net 2.0 编译:
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727csc.exe /out:test.exe Program.cs
当我在台式计算机上运行此程序时,一切正常。但是当我在服务器上运行它时,它会崩溃。我找不到问题。
如果我使用 .net 1.1 编译它:
C:WINDOWSMicrosoft.NETFrameworkv1.1.4322csc.exe /out:test.exe Program.cs
在台式PC和服务器上也可以。那么问题出在哪里呢?请帮忙。
更新
通过使用/platform:anycpu32bitpreferred 解决
C:WINDOWSMicrosoft.NETFrameworkv4.0.30319csc.exe /unsafe /platform:anycpu32bitpreferred /out:test.exe Program.cs
我怀疑你会发现问题在于,在这两种情况下,使用.NET 1.1您都运行x86 CLR,而对于.NET 2.0,您可能在桌面上运行x86,在服务器上运行x64。
IntPtr.ToInt32
记录在以下情况下会抛出OverflowException
:
在 64 位平台上,此实例的值太大或太小,无法表示为 32 位有符号整数。
基本上,这样称呼是危险的。为什么不直接使用IntPtr.GetHashCode()
?(老实说,目前还不清楚你到底想用这段代码实现什么。