我发现TryCast在.NET 4.0 / VS 2010中的这种行为相当令人困惑。
根据我的理解,TryCast的工作方式类似于DirectCast,但如果不可能进行强制转换,则不会返回任何异常,而不会抛出异常。
VS 2010 / .NET 4
?TryCast(CType(1, Object), String)
Nothing
?DirectCast(CType(1, Object), String)
"1"VS 2008 / .NET 3.5
?TryCast(CType(1, Object), String)
Nothing
?DirectCast(CType(1, Object), String)
Cannot convert to 'String'..NET 3.5的结果与我认为TryCast所做的一致.然而,.NET 4却不是。
有人能指点我在.NET 4中安全地将一个对象抛出字符串的最佳方向吗?
发布于 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转换。因此,这种转换在应该失败的地方成功。
https://stackoverflow.com/questions/3523546
复制相似问题