首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TryCast在DirectCast工作的地方失败(.NET 4.0)

TryCast在DirectCast工作的地方失败(.NET 4.0)
EN

Stack Overflow用户
提问于 2010-08-19 15:44:31
回答 1查看 1.3K关注 0票数 11

我发现TryCast在.NET 4.0 / VS 2010中的这种行为相当令人困惑。

根据我的理解,TryCast的工作方式类似于DirectCast,但如果不可能进行强制转换,则不会返回任何异常,而不会抛出异常。

VS 2010 / .NET 4

代码语言:javascript
复制
?TryCast(CType(1, Object), String)
Nothing
?DirectCast(CType(1, Object), String)
"1"

VS 2008 / .NET 3.5

代码语言:javascript
复制
?TryCast(CType(1, Object), String)
Nothing
?DirectCast(CType(1, Object), String)
Cannot convert to 'String'.

.NET 3.5的结果与我认为TryCast所做的一致.然而,.NET 4却不是。

有人能指点我在.NET 4中安全地将一个对象抛出字符串的最佳方向吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-19 15:52:22

根据从?开始的代码示例,我猜您正在使用即时窗口来执行测试,对吗?这种方法的问题是,直接的窗口是解释而不是实际的评估。这使得它很容易受到细微的角落错误的影响,这确实是其中之一。

如果将示例代码添加到一个简单的VB.Net控制台应用程序中,您会发现2010年的行为与2008年的行为相同(抛出异常)。

编辑

那么,为什么会出现这种倒退呢?在2010年,我完全重写了VB调试引擎(表达式计算器)。我继承的旧代码库太昂贵,无法再维护了。在引擎中添加新特性的代价更高,因此从零开始重写它,使用包含新功能的更好的体系结构。

如前所述,调试评估不仅仅是代码的执行,更是一种解释。它迫使EE和CLR / Compiler之间的一些算法重复。复制发生的领域之一是在转换逻辑中。没有办法要求CLR调试器强制转换调试时对象,EE有责任确定指定的强制转换语言是否有效。

旧的EE转换逻辑有许多错误(特别是在泛型和数组领域)。较新的基础设施非常符合CLR准则。然而,您将永远不会有100%的平价,因为它将不允许非常有用的表达式在EE (我可能会写一篇博客文章在这方面在未来)。但在大多数情况下,这种行为仍然有效。

在这个特殊的例子中,我添加了一个微妙的bug,允许一个值为DirectCast的Object使用VB的运行时转换操作符,而指定的行为只允许CLR转换。因此,这种转换在应该失败的地方成功。

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

https://stackoverflow.com/questions/3523546

复制
相关文章

相似问题

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