C#和VB.NET中的转换之间的区别

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?

Rom*_*iko 11

来自MSDN:

对于抛出OverflowException的算术,转换或转换操作,操作必须在已检查的上下文中进行.默认情况下,检查Visual Basic中的算术运算和溢出; 在C#中,它们不是.如果操作发生在未经检查的上下文中,则通过丢弃不适合目标类型的任何高位来截断结果.

编辑:如果您要将代码从C#移植到VB.NET,您可能会对它们之间的差异感兴趣.还要将编译器设置进行比较和显式设置,使其与C#中的默认设置相同(如果需要).


Ben*_*ter 8

首先:我对此的理解是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位整数(短)将经常导致溢出,因此我会说这是一个固有的危险操作.