C# 类型转换难题:为什么 List<string>
不能转换为 List<object>
?
在 C# 中,尝试将 List<string>
对象赋值给 List<object>
变量会引发一个有趣的异常。这种转换为何不被允许,一直困扰着许多开发者。
问题剖析
考虑以下代码片段:
List<string> sl = new List<string>(); List<object> ol; ol = sl; // 隐式转换不被允许 ol = (List<object>)sl; // 显式转换也失败
隐式和显式转换尝试均失败,这让我们不禁疑问原因所在。
根本原因
这种限制的主要原因在于列表内部可能出现不一致性。如果我们允许这种转换,随后又向列表中添加类型为 Foo
的对象,则字符串列表将变得不一致。
当迭代第一个列表引用时,我们会遇到类转换异常,因为 Foo
实例无法转换为字符串。维护类型一致性对于确保列表中数据的完整性至关重要。
反向转换:更深入的探讨
然而,关于反向转换,一个有趣的问题出现了:
List<object> ol = new List<object>(); List<string> sl; sl = (List<string>)ol;
这种转换是否允许?虽然它似乎可能有用,但允许这种转换可能会引入运行时错误或不一致性。从更通用的类(object
)到更具体的类(string
)的转换,任何添加到字符串列表中的对象可能与对象列表不兼容。
反向转换在 C# 中能否成功?
目前尚不清楚这种反向转换在 C# 中是否合法。如果合法,它将突出显示隐式转换和显式转换之间的区别,后者似乎违反了类型一致性规则。对此方面的进一步测试和澄清将非常有价值。
以上是为什么我不能在C#中将`列表'列为``列表''?的详细内容。更多信息请关注PHP中文网其他相关文章!