Ign*_*cia 8 .net c# vb.net casting overflow
以下代码在C#中正常工作.
Int32 a, b;
Int16 c;
a = 0x7FFFFFFF;
b = a & 0xFFFF;
c = (Int16)b;
Run Code Online (Sandbox Code Playgroud)
但是这个代码在VB.NET中出现了OverflowException .
Dim a, b As Int32
Dim c As Int16
a = &H7FFFFFFF
b = a And &HFFFF
c = CType(b, Int16)
Run Code Online (Sandbox Code Playgroud)
两个代码片段对我来说都是一样的.有什么区别,如何将C#代码转换为VB.NET?
首先:我对此的理解是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位整数(短)将经常导致溢出,因此我会说这是一个固有的危险操作.