2010-08-19 16 views
11

我發現.NET 4.0/VS 2010中TryCast的這種行爲相當混亂。TryCast在DirectCast工作的地方失敗(.NET 4.0)

在我的理解中,TryCast的工作方式與DirectCast類似,但如果不能投射,將返回Nothing而不是拋出異常。

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中的字符串嗎?

回答

16

根據你的代碼示例開始?我猜你正在使用立即窗口來執行你的測試是否正確?這種方法的問題是,直接窗口是一種解釋,而不是實際的評估。這使它容易受到細微的角落病例的影響,這確實是其中之一。

如果您將示例代碼添加到簡單的VB.Net控制檯應用程序中,您會發現2010行爲與2008行爲相同(引發異常)。

編輯

那麼,爲什麼這種迴歸發生的呢?在2010年,我完全重寫了VB EE調試引擎(表達式評估器)。我繼承的舊代碼基礎太昂貴,無法維護。爲了向引擎添加新功能更加昂貴,需要使用包含新功能的更好體系結構從頭開始重寫。

如前所述,調試評估是一種解釋而不是執行代碼。它迫使EE和CLR/Compiler之間的一些算法重複。鑄造邏輯中發生重複的地方之一。無法要求CLR調試器投射調試時間對象,EE的責任是確定指定的語言是否真的有效。

舊的EE轉換邏輯有許多錯誤(特別是在泛型和數組領域)。較新的基礎設施非常符合CLR指南。然而,你永遠不會有100%的平等,因爲它不允許在EE中使用非常有用的表達方式(我可能會在未來寫一篇博客文章)。但在大多數情況下,這種行爲是成立

在這個特定的實例中,我添加了一個微妙的錯誤,它允許DirectCast輸入一個值爲Object的值,以使用VB的運行時轉換運算符與只允許進行CLR轉換的指定行爲。因此,這種轉換成功的地方應該會失敗。

+0

我剛剛證實你的建議。 DirectCast()確實在實際評估中運行時會引發異常。感謝您的澄清! – motto 2010-08-19 16:00:38

+0

如果你能解釋到底發生了什麼,那將是非常整潔的。 – SLaks 2010-08-19 16:02:52

+0

@SLaks,添加了一個快速解釋。 – JaredPar 2010-08-19 16:12:28

相關問題