我有一个包含 ID 号的 CSV 文件,我需要将其作为
IEnumerable<int>
。我试图尽可能简单地从 A 到达 B,并提出了以下想法:
Global.migrated = File.ReadAllText(Global.migrationList).Split(',').Cast<int>().ToList<int>();
但是,当我运行此命令时,我被告知 Cast 无效。我还尝试读取字符串列表并转换为 int:
List<string> myTemp = File.ReadAllText(Global.migrationList).Split(',').ToList<string>();
Global.migrated = myTemp.Cast<int>();
但这会引发以下错误:
无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.List”。存在显式转换。缺演员吗?
我不明白。在这种情况下,我尝试投射的对象不是
IEnumerable<int>
。应该是List<string>
。我担心我错过了关于选角如何运作的一些重要信息。
您需要转换对象,而不是强制转换它。
File.ReadAllText(Global.migrationList).Split(',')
.Select(x=> Convert.ToInt32(x)).ToList();
强制转换与转换的不同之处在于,字符串值是字符串,而不是 CLR 所关注的数字。如果被投射的对象是
float
、decimal
、double
或任何数字类型,那么投射就可以正常工作。但由于该对象是 string
,CLR 无法强制转换该对象。但是,您可以将 string
转换为 integer
,它实际上会解析对象并返回一个新对象,而不仅仅是转换其 CLR 类型。
虽然您可能认为转换和转换在实际用途中非常相似,但它们与 CLR 非常不同
您无法对可枚举的字符串执行
Cast<int>()
,其原因与您无法执行 (int)"123"
的原因相同 - string
和 int
之间不存在此类隐式或显式转换运算符。1
只需使用
Select()
,通过int.Parse()
传递字符串元素:
Global.migrated = File.ReadAllText(Global.migrationList)
.Split(',')
.Select(i => int.Parse(i))
.ToList();
1 从技术上讲,如果存在这样的用户定义运算符,那么无论如何这里都不会使用它。转换在编译时解析,泛型类型在运行时替换,因此在转换为泛型类型或从泛型类型转换时,不使用用户定义的转换运算符(除非涉及约束,因为存在一定量的信息在这种情况下,可以在编译时推导出来)。但我离题了。