.NET 3.5 SP1 中 Enumerable.Cast
拋出 InvalidCastException
在 .NET 3.5 SP1 中,使用 Enumerable.Cast
方法將一種類型的集合轉換為另一種類型時,觀察到一種特殊行為。以下程式碼:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Cast<long>(); Console.WriteLine(castedList.First());</code>
意外地拋出 InvalidCastException
。當使用 LINQ 語法時,也會出現這個令人費解的錯誤,如下面的程式碼所示:
<code class="language-csharp">var list = new[] { 1 }; var castedList = from long l in list select l; Console.WriteLine(castedList.First());</code>
揭示隱藏的行為
起初,這種轉換為什麼會失敗似乎令人困惑。但是,一篇部落格文章闡明了潛在的問題。在 .NET 3.5 SP1 中,Cast<T>()
方法被修改為作用於 IEnumerable
而不是 IEnumerable<T>
。因此,集合中的每個元素在到達轉換階段之前都被裝箱到 System.Object
中。
暴露根本原因
這種根本性的轉變導致了一個細微的問題。 InvalidCastException
本質上是由嘗試以下轉換引起的:
<code class="language-csharp">int i = 1; object o = i; long l = (long)o;</code>
如這段程式碼所示,將 int
直接轉換為 long
會產生預期結果;但是,將裝箱的 int
轉換為 long
會失敗。這就解釋了為什麼初始程式碼片段及其 LINQ 對應部分無法如預期般運作。
尋找解決方法
為了避免這種異常,必須明確地執行轉換:
<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
這種替代方法成功地轉換了每個元素,而不會遇到無效的轉換異常。
這種不尋常的行為提醒我們,一些細微的幕後機制可能會影響程式碼執行。為了避免將來出現類似的陷阱,值得探索替代方法或明確處理轉換。
以上是為什麼「Enumerable.Cast」在 .NET 3.5 SP1 中拋出「InvalidCastException」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!