首先:我对此的理解是 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# 不检查溢出的事实有关。
UInt16.MaxValue (65535) UInt16中结果的结果值&H7FFFFFFF And &HFFFF
从 0 运行到 65535,您试图将其填充到从 -32768 到 32767 的 Int16 中,如您所见,这是行不通的。此外,这个值可能适合 UInt16 的事实是巧合,添加两个 32 位整数并试图将它们塞进一个 16 位整数(短)经常会导致溢出,因此我会说这是一个固有的危险操作。