【发布时间】:2016-12-15 16:27:45
【问题描述】:
考虑以下枚举声明和 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();
只有原始数据是数组才行不通。
【问题讨论】:
-
为什么?
Array.ConvertAll工作效率更高 -
@TimSchmelter 我想这确实是一个学术问题。
-
现在我对它为什么不起作用很感兴趣...... :)
-
其实
Cast<T>和我的答案大致相同:referencesource.microsoft.com/#System.Core/System/Linq/… -
@DanielA.White 除了你的作品和 Cast 没有!
标签: c# .net linq ienumerable