如何使用IEnumerable.Cast <>和.ToArray()将int数组转换为枚举数组?

Mat*_*son 8 .net c# linq ienumerable

考虑以下枚举声明和int数组:

enum Test { None };

int[] data = {0};
Run Code Online (Sandbox Code Playgroud)

要将此int[]数组转换为Test[]数组,我们可以简单地执行此操作:

Test[] result = Array.ConvertAll(data, element => (Test)element);
Run Code Online (Sandbox Code Playgroud)

我最初试图这样做:

Test[] result = data.Cast<Test>().ToArray();
Run Code Online (Sandbox Code Playgroud)

但是,它会在运行时抛出异常:

System.ArrayTypeMismatchException:无法将源数组类型分配给目标数组类型.

问题一

有没有办法使用Linq并Cast<>没有错误,或者我必须使用Array.Convert()

问题二(在第一个问题得到正确回答后添加)

究竟为什么不起作用?

看起来这是一个实现细节逃逸的情况......考虑:

这会导致错误:

var result = data.Cast<Test>().ToList(); // Happens with "ToList()" too.
Run Code Online (Sandbox Code Playgroud)

但这不是:

var result = new List<Test>();

foreach (var item in data.Cast<Test>())
    result.Add(item);
Run Code Online (Sandbox Code Playgroud)

这也不是:

var result = data.Select(x => x).Cast<Test>().ToList();
Run Code Online (Sandbox Code Playgroud)

明确的含义是在.ToList()实现中正在进行某种优化,导致此异常.


附录:

这也有效:

List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToList();
Run Code Online (Sandbox Code Playgroud)

要么

List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToArray();
Run Code Online (Sandbox Code Playgroud)

只有当原始数据是一个不起作用的数组时.

Dan*_*ite 8

你可以用.Select(e => (Test)e).