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

Arithmetic overflow exception in .net 2.0 and greater

我遇到了这个错误

System.OverflowException: Arithmetic operation resulted in an overflow.

当我 运行 我的应用程序在 Windows Server 2008 R2 Standard 上用 .Net 2.0 或更高版本 (.Net 4.0) 编译时。据我所知,如果 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:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe /out:test.exe Program.cs

当我 运行 在我的台式电脑上运行这个程序时,一切正常。但是当我 运行 它在服务器上时,它崩溃了。我找不到问题。

如果我用 .net 1.1 编译它:

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\csc.exe /out:test.exe Program.cs

在台式电脑和服务器上都可以。那么问题出在哪里呢?请帮忙。

更新

使用/platform:anycpu32bitpreferred解决

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe /unsafe /platform:anycpu32bitpreferred /out:test.exe Program.cs

我怀疑您会发现问题在于,对于 .NET 1.1,您在这两种情况下都是 运行 x86 CLR,而对于 .NET 2.0,您可能是 运行 x86您的桌面和服务器上的 x64。

IntPtr.ToInt32documented 抛出 OverflowException when:

On a 64-bit platform, the value of this instance is too large or too small to represent as a 32-bit signed integer.

基本上,这样称呼是很危险的。为什么不直接使用 IntPtr.GetHashCode()? (老实说,尚不清楚您究竟想用这段代码实现什么。)