Dot-Net

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

  • March 20, 2012

我發現 TryCast 在 .NET 4.0 / VS 2010 中的這種行為相當令人困惑。

據我了解,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 中安全地將對象轉換為 String 的最佳方向嗎?

根據您的程式碼範例,?我猜您正在使用即時視窗正確執行測試?這種方法的問題在於即時視窗是一種解釋而不是實際評估。這使它容易受到微妙的角落案例錯誤的影響,這確實是其中之一。

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

編輯

那麼為什麼會發生這種回歸呢?2010年徹底改寫了VB EE調試引擎(表達式求值器)。我繼承的舊程式碼庫的維護成本太高了。以至於向引擎添加新功能比使用包含新功能的更好架構從頭開始重寫它更昂貴。

如前所述,調試評估是一種解釋,而不是程式碼的執行。它強制在 EE 和 CLR/編譯器之間重複某些算法。發生重複的領域之一是鑄造邏輯。沒有辦法要求 CLR 調試器強制轉換調試時間對象,EE 有責任確定指定的語言強制轉換是否確實有效。

舊的 EE 轉換邏輯有很多錯誤(尤其是在泛型和數組領域)。較新的基礎架構非常符合 CLR 指南。但是,您永遠不會有 100% 的奇偶性,因為它會禁止在 EE 中使用非常有用的表達式(我將來可能會就此寫一篇博文)。但在大多數情況下,這種行為是成立的。

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

引用自:https://stackoverflow.com/questions/3523546