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)
只有当原始数据是一个不起作用的数组时.
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |