整数溢出 - 将C#代码转换为VB.Net代码

3

我需要将C#代码转换为VB.Net,但遇到了问题。

var x = 5783615;
var y = 56811584;
var t = x * y;

x,y和t是整数。在C#中,'t'将为-1553649728。 在VB.Net中,我会收到整数溢出异常。

有什么解决办法吗?


看一下显式类型定义。Var是隐式的。 - Nate-Wilkins
3个回答

6

C#默认情况下不检查溢出,但VB(Visual Basic)则会(默认情况下)。

您可以在编译选项的高级编译选项中设置VB项目以不检查整数溢出。这将导致该特定项目在类似于此类情况下停止引发OverflowException异常。


5
我不确定那是否算作一个“修复”。 :) - Bazzz
但是,除非溢出是必需的值,否则最好获取实际值。 - Peter Smith
这要看情况 - 这使得VB代码的行为与C#代码相同,因为它是一个移植,如果你假设C#代码是正确的,在这种情况下移植后的代码会是正确的。虽然这可能是一个不正确的假设,但这将导致VB项目在起始点与C#项目的行为相同。也许好,也许不好,但这是我在单元测试中修复的问题... - Reed Copsey
@Bazzz 这是一个现有项目的移植,显然存在溢出 - 因此可能预计并正确处理了溢出。 - Reed Copsey
@Bazzz 但这不是好的实践方式 - 应该检查值。依赖异常应该是最后的选择。当然应该推广良好的实践方式,如果这是一个端口,那么这是一个很好的机会来清理它 :-) - Peter Smith
@PeterSmith 这真的取决于它被用于什么。有时未经检查的整数运算是完全可以接受的(例如:实现GetHashCode()就是一个很好的例子)。在我看来,这是C#的一个优点 - 你可以在应用程序中拥有已检查/未检查的范围,而不必指定整个项目必须被检查或未检查。 - Reed Copsey

4

您可以通过在64位中计算乘积,然后仅使用结果的32位来获得与C#忽略溢出相同的值:

Dim x As Integer = 5783615
Dim y As Integer = 56811584
Dim tmp As Int64 = Convert.ToInt64(x) * Convert.ToInt64(y)

Dim bb = BitConverter.GetBytes(tmp)
Dim t = BitConverter.ToInt32(bb, 0)
' t is now -1553649728

谢谢。我不想完全禁用溢出检查,但想在特定位置执行未经检查的转换。使用您的解决方案,这是可能的。 - Dennis Kassel
@GinoBambino,我后来发现有更好的方法:VB.NET中执行不安全算术运算的实用方法是否存在? - Andrew Morton
是的。它也应该表现更好,因为它需要少一次转换。谢谢。 - Dennis Kassel

0

你需要显式类型定义来避免这种情况,因为定义将隐式地从值中获取。在vb.net中尝试:

dim x as int = 5783615
dim y as int = 56811584
dim t as int = x * y

可能有其他方法可以实现,但这应该是一个开始。在C#中,您还可以尝试int或int32或int64。

祝你好运。


1
这不是有效的VB语法。具体来说,“int”不是VB中的一种类型。我猜你的意思是Integer。 - Chris Dunaway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接