下面的代码在C#中运行良好。
Int32 a, b;
Int16 c;
a = 0x7FFFFFFF;
b = a & 0xFFFF;
c = (Int16)b;但这段代码在VB.NET中使用OverflowException时会崩溃。
Dim a, b As Int32
Dim c As Int16
a = &H7FFFFFFF
b = a And &HFFFF
c = CType(b, Int16)这两个代码片段在我看来是一样的。有什么区别?如何将C#代码转换为VB.NET?
发布于 2009-12-09 22:19:14
From MSDN
对于抛出OverflowException的算术、强制转换或转换操作,该操作必须在已检查的上下文中发生。默认情况下,在Visual Basic中检查算术运算和溢出;在C#中则不检查。如果操作发生在未经检查的上下文中,则通过丢弃不适合目标类型的任何高位来截断结果。
编辑:如果你打算将代码从C#移植到VB.NET,你可能会对differences between them感兴趣。还要比较并显式地将compiler settings设置为与C#中的默认设置相同(需要时)。
发布于 2009-12-09 22:09:22
首先:我对此的理解是CType(b,Int16)与(Int16)b不同,一个是类型(CType)的转换,另一个是类型转换。( Int16) b等于DirectCast(b,Int16)而不是CType(b,Int16)。
两者之间的区别(如MSDN中所述)是,只要存在有效的转换,CType就会成功,然而,DirectCast要求对象的运行时类型相同,因此,您所做的只是在设计时告诉编译器此对象属于该类型,而不是告诉它转换为该类型。
请参阅:http://msdn.microsoft.com/en-us/library/7k6y2h6x(VS.71).aspx
然而,潜在的问题是,您正在尝试将32位整数转换为16位整数,这是...我遗漏了我需要的词,也许有人可以在这里为我插入有损。从16位到32位的转换是允许的,因为它是无损的,从32位到16位的转换是不确定的。关于它在C#中工作的原因,你可以看看@Roman的答案--它与C#不检查溢出的事实有关。
&H7FFFFFFF And &HFFFF的结果值结果是UInt16.MaxValue ( 65535 ) UInt16运行在0到65535之间,你试图将它塞进Int16中,它运行在-32768到32767之间,正如你所看到的,这是不起作用的。此外,这个值可能适合UInt16的事实也是巧合的,将两个32位整数相加并试图将它们填入16位整数(短整型)将经常导致溢出,因此我认为这是一个固有的危险操作。
发布于 2009-12-09 22:08:34
你试过使用DirectCast(b, Int16)吗?CType与C#强制转换不同。
Here的一篇文章比较了DirectCast和CType的性能,并更详细地讨论了何时应该使用这两种语言。
https://stackoverflow.com/questions/1874130
复制相似问题