考虑以下枚举声明和int数组:
enum Test { None };
int[] data = {0};
要将这个int[]
数组转换成一个Test[]
数组,我们可以简单地做到这一点:
Test[] result = Array.ConvertAll(data, element => (Test)element);
我最初尝试这样做:
Test[] result = data.Cast<Test>().ToArray();
但是,这会在运行时引发异常:
System.ArrayTypeMismatchException:无法将源数组类型分配给目标数组类型。
问题一
有没有办法使用Linq并Cast<>
没有错误地执行此操作,还是我必须使用Array.Convert()
?
问题二(在正确回答第一个问题后添加)
究竟为什么不起作用?
似乎是实现细节转义的情况...考虑:
这会导致错误:
var result = data.Cast<Test>().ToList(); // Happens with "ToList()" too.
但这不是:
var result = new List<Test>();
foreach (var item in data.Cast<Test>())
result.Add(item);
而且也不是:
var result = data.Select(x => x).Cast<Test>().ToList();
明确的含义是,在.ToList()
导致此异常的实现中进行了某种优化。
附录:
这也适用:
List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToList();
要么
List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToArray();
仅当原始数据是数组时它才起作用。
您可以使用.Select(e => (Test)e)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句