为什么Select(x =>..Cast())不工作

本文关键字:Select 工作 GetType 为什么 Cast | 更新日期: 2023-09-27 18:01:27

为什么下面的代码会产生一个错误?

var listOfList = new List<List<string>>();
var tmp = listOfList.Select(x => x.OrderBy(y => y).Cast<x.GetType()>());
错误:

操作符'<'不能应用于'method group'和'System '类型的操作数。类型的

代码看起来很傻,因为它与我的实际示例相比非常简化。我只是想知道为什么它不起作用。如果我将x.getType()替换为List<string>,它可以工作,但我现在不知道运行时x的类型。
澄清一下:我不需要寻找解决方案。我想知道我的代码到底出了什么问题。

为什么Select(x =>..Cast<x.GetType()>())不工作

正确的代码编写方法是使用ToList而不是其他地方提到的Cast

然而,要回答"我的代码到底出了什么问题?"这个问题,有两个具体的点可以开始:

  • 使用Cast<x.GetType()>():

泛型用于编译时类型变量,所以把Cast<List<string>>()放在这里会更有意义——x.GetType()只在运行时解析。我猜你得到的实际消息是编译器在这一点上混淆的结果。

  • 尝试转换到List<string>:

即使特定的强制转换代码语法是合理的,实际的强制转换仍然会失败。此时,您正在尝试将OrderedEnumerable<string>转换为List<string>。这不是一个有效的类型转换。ToList()将未解析的order语句解析为一个列表。

为什么要这样做?我猜你需要这个代码

var listOfList = new List<List<string>>();
var tmp = listOfList.Select(x => x.OrderBy(y => y).ToList());