首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#和VB.NET中强制转换的区别

C#和VB.NET中强制转换的区别
EN

Stack Overflow用户
提问于 2009-12-09 22:06:42
回答 7查看 3K关注 0票数 8

下面的代码在C#中运行良好。

代码语言:javascript
运行
复制
    Int32 a, b;
    Int16 c;

    a = 0x7FFFFFFF;
    b = a & 0xFFFF;
    c = (Int16)b;

但这段代码在VB.NET中使用OverflowException时会崩溃。

代码语言:javascript
运行
复制
    Dim a, b As Int32
    Dim c As Int16

    a = &H7FFFFFFF
    b = a And &HFFFF
    c = CType(b, Int16)

这两个代码片段在我看来是一样的。有什么区别?如何将C#代码转换为VB.NET?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-09 22:19:14

From MSDN

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

编辑:如果你打算将代码从C#移植到VB.NET,你可能会对differences between them感兴趣。还要比较并显式地将compiler settings设置为与C#中的默认设置相同(需要时)。

票数 11
EN

Stack Overflow用户

发布于 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位整数(短整型)将经常导致溢出,因此我认为这是一个固有的危险操作。

票数 8
EN

Stack Overflow用户

发布于 2009-12-09 22:08:34

你试过使用DirectCast(b, Int16)吗?CType与C#强制转换不同。

Here的一篇文章比较了DirectCastCType的性能,并更详细地讨论了何时应该使用这两种语言。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1874130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档