C# 類型轉換難題:為什麼 List<string>
不能轉換為 List<object>
?
在 C# 中,嘗試將 List<string>
對象賦值給 List<object>
變量會引發一個有趣的異常。這種轉換為何不被允許,一直困擾著許多開發者。
問題剖析
考慮以下代碼片段:
<code class="language-csharp">List<string> sl = new List<string>(); List<object> ol; ol = sl; // 隐式转换不被允许 ol = (List<object>)sl; // 显式转换也失败</code>
隱式和顯式轉換嘗試均失敗,這讓我們不禁疑問原因所在。
根本原因
這種限制的主要原因在於列表內部可能出現不一致性。如果我們允許這種轉換,隨後又向列表中添加類型為 Foo
的對象,則字符串列表將變得不一致。
當迭代第一個列表引用時,我們會遇到類轉換異常,因為 Foo
實例無法轉換為字符串。維護類型一致性對於確保列表中數據的完整性至關重要。
反向轉換:更深入的探討
然而,關於反向轉換,一個有趣的問題出現了:
<code class="language-csharp">List<object> ol = new List<object>(); List<string> sl; sl = (List<string>)ol;</code>
這種轉換是否允許?雖然它似乎可能有用,但允許這種轉換可能會引入運行時錯誤或不一致性。從更通用的類(object
)到更具體的類(string
)的轉換,任何添加到字符串列表中的對象可能與對象列表不兼容。
反向轉換在 C# 中能否成功?
目前尚不清楚這種反向轉換在 C# 中是否合法。如果合法,它將突出顯示隱式轉換和顯式轉換之間的區別,後者似乎違反了類型一致性規則。對此方面的進一步測試和澄清將非常有價值。
以上是為什麼我不能在C#中將`列表'列為``列表''?的詳細內容。更多資訊請關注PHP中文網其他相關文章!