【问题标题】:Why can't I cast List<object> to List<string> in C#? [duplicate]为什么我不能在 C# 中将 List<object> 转换为 List<string>? [复制]
【发布时间】:2021-05-07 06:30:04
【问题描述】:

代码:

object obj = new List<object>() { "a", "b" };
List<string> list = (List<string>)obj;

例外:

System.InvalidCastException
HResult=0x80004002
Message=Unable to cast object of type 'System.Collections.Generic.List`1[System.Object]' to type 'System.Collections.Generic.List`1[System.String]'.
 Source=ConsoleApp2
 StackTrace:
 at ConsoleApp2.Program.Main(String[] args) in 
 C:\Users\guoswang\source\repos\ConsoleApp2\ConsoleApp2\Program.cs:line 12

我知道如何避免这种情况,但想了解根本原因。

Cast exception

【问题讨论】:

  • 那些对象真的是字符串吗?
  • 您可以对列表中的每个项目使用Select 方法
  • 事情是:List&lt;object&gt;不是List&lt;string&gt;。并且请在将来包含代码作为您的问题中的文本。你可以但是创建一个List&lt;string&gt;通过OfType<string>()
  • @madoxdev,是的,它们都是字符串。

标签: c#


【解决方案1】:

假设您有 List&lt;object&gt; 填充有 string 对象,您可以执行以下操作:

List<object> someStrings = new List<object> {"string1", "string2"};
List<string> afterCast = someStrings.Cast<string>().ToList();
List<string> otherOption = someStrings.OfType<string>().ToList();

Cast 和 OfType 运算符的区别:

C# 中的 Cast 运算符将尝试将源序列中存在的所有元素转换为指定的类型。如果源序列中的任何元素无法转换为指定类型,则会抛出 InvalidCastException。

另一方面,C# 中的 OfType 运算符仅返回指定类型的元素,源序列中的其余元素将被忽略并从结果中排除。

更多解释可以在这里找到:https://dotnettutorials.net/lesson/difference-between-cast-and-oftype-operators/

【讨论】:

  • 很高兴您同时提到了.Cast.OfType,但提及它们之间的区别可能会很有用。
  • 感谢您的解决方案和详细解释。但是我真的很想知道为什么我不能直接将 List 转换为 List,即使里面的所有元素都是字符串。
  • @Guosen - 仅仅因为两种类型表现出特定的继承关系,并不意味着由这两种类型参数化的泛型类型表现出相同的继承关系。 List&lt;string&gt; 不是从 List&lt;object&gt; 派生的。
  • @Damien_The_Unbeliever,我明白了,非常感谢。
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多