none
vb.net 类型转换 RRS feed

  • 问题

  • 在C#中的“(short) 变量”转换为VB.net“Cshort(变量)”为什么会溢出??在C#中为什么不会溢出?

    如下:

    在C#下
    int I = 8978527;
    short s = (short)I;

    结果:s=95


    在vb.net下
    Dim i As Integer = 8978527
    Dim s As Short = CShort(i)

    结果:CShort(i)=溢出

    为什么???

    2010年4月17日 14:35

答案

  • Hi,

    如果用Reflector查看,两者在IL方面是不同的

    C#

      .maxstack 1
      .locals init (
        [0] int32 I,
        [1] int16 s)
      L_0000: nop 
      L_0001: ldc.i4 0x89005f
      L_0006: stloc.0 
      L_0007: ldloc.0 
      L_0008: conv.i2 
      L_0009: stloc.1 
      L_000a: ret 

    VB

      .maxstack 1
      .locals init (
        [0] int32 i,
        [1] int16 s)
      L_0000: nop 
      L_0001: ldc.i4 0x89005f
      L_0006: stloc.0 
      L_0007: ldloc.0 
      L_0008: conv.ovf.i2 
      L_0009: stloc.1 
      L_000a: nop 
      L_000b: ret 
    C#是用conv.i2 而VB是用conv.ovf.i2 。从msdn中找到conv.ovf.i2是会溢出的。

    • 已标记为答案 生命 2010年4月17日 16:40
    2010年4月17日 16:32

全部回复

  • Hi,

    如果用Reflector查看,两者在IL方面是不同的

    C#

      .maxstack 1
      .locals init (
        [0] int32 I,
        [1] int16 s)
      L_0000: nop 
      L_0001: ldc.i4 0x89005f
      L_0006: stloc.0 
      L_0007: ldloc.0 
      L_0008: conv.i2 
      L_0009: stloc.1 
      L_000a: ret 

    VB

      .maxstack 1
      .locals init (
        [0] int32 i,
        [1] int16 s)
      L_0000: nop 
      L_0001: ldc.i4 0x89005f
      L_0006: stloc.0 
      L_0007: ldloc.0 
      L_0008: conv.ovf.i2 
      L_0009: stloc.1 
      L_000a: nop 
      L_000b: ret 
    C#是用conv.i2 而VB是用conv.ovf.i2 。从msdn中找到conv.ovf.i2是会溢出的。

    • 已标记为答案 生命 2010年4月17日 16:40
    2010年4月17日 16:32
  •       要使算术运算、强制转换操作或转换操作引发 OverflowException,操作必须发生在所检查的上下文中。默认情况下,在 Visual Basic 中会检查数学运算和溢出;在 C# 中不检查数学运算和溢出。如果操作发生在未检查的上下文中,计算的结果被截断,放弃不适合目标类型的任何高序位。
    2010年4月17日 16:40