.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.ToInt32
是 documented 抛出 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()
? (老实说,尚不清楚您究竟想用这段代码实现什么。)
我遇到了这个错误
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.ToInt32
是 documented 抛出 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()
? (老实说,尚不清楚您究竟想用这段代码实现什么。)