为什么Select(x =&gt; ... Cast <x.gettype()>())不起作用?

时间:2015-07-08 07:31:27

标签: c# linq select casting typeof

为什么以下代码会产生错误?

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

错误:

  

运营商'&lt;'不能应用于'方法组'和'System.Type'

类型的操作数

代码看起来很愚蠢,因为它从我的真实例子中极度简化。我只是想知道为什么它不能正常工作。如果我用x.getType()替换List<string>,它会起作用,但我现在不在运行时使用x的类型。
澄清一下:我没有必要寻找解决方案。我想知道我的代码到底出了什么问题。

2 个答案:

答案 0 :(得分:5)

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

然而,要回答“我的代码到底出了什么问题?”这个问题。有两个具体要点:

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

泛型与编译时类型变量一起使用,因此将Cast<List<string>>()放在这里会更有意义 - x.GetType()只能在运行时解析。我猜你得到的实际信息是编译器在这一点上变得混乱的结果。

  • 尝试施放到List<string>

即使特定的强制转换语法合理,实际的强制转换仍然会失败。此时您正试图将OrderedEnumerable<string>投射到List<string>。这不是有效的演员表。 ToList()将未解析的orderby语句解析为列表。

答案 1 :(得分:2)

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

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