理解InvalidCastException
與IEnumerable.Cast
嘗試使用 IEnumerable<int>
將 IEnumerable<long>
轉換為 Cast<T>
通常會導致令人困惑的 InvalidCastException
。 這個看似簡單的操作由於 Cast<T>
方法中的微妙機製而失敗。考慮這個例子:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Cast<long>(); Console.WriteLine(castedList.First());</code>
根本原因:裝箱與拆箱
理解這一點的關鍵在於Cast<T>
如何運作。 它是 IEnumerable
上的擴充方法,而不是 IEnumerable<T>
。這意味著在嘗試轉換為 IEnumerable<int>
之前, 中的每個元素首先被 裝箱System.Object
到 long
中。 這在功能上相當於:
<code class="language-csharp">int i = 1; object o = i; // Boxing long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
InvalidCastException
發生在拆箱 步驟。雖然從 int
到 long
的直接轉換是有效的,但將裝箱的 int
拆箱到 long
是無效的。
解析度
要避免這種 InvalidCastException
,請使用在強型別 IEnumerable<T>
上下文中處理轉換的方法,例如 Select
:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Select(x => (long)x); Console.WriteLine(castedList.First());</code>
此方法在int
裝箱發生之前直接對每個元素執行強制轉換,從而防止InvalidCastException
。 與依賴 Select
進行此類轉換相比,使用 Cast<T>
提供了更乾淨、更有效率的解決方案。
以上是為什麼「IEnumerable.Cast」會拋出「InvalidCastException」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!