.net 2.0 及更高版本中的算术溢出异常



我收到此错误

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()?(老实说,目前还不清楚你到底想用这段代码实现什么。

最新更新