C#中ToList()后链式调用Sort()方法报错的原因咨询
报错根本原因
问题和var关键字没有任何关系,核心原因是**List<T>.Sort()方法的返回值为void**:
- 这个方法是原地排序方法,只会直接修改当前列表实例内部的元素顺序,执行完成后不会返回任何结果(也就是没有返回值),自然不能赋值给任何变量。
两种写法的逻辑差异
你之前能正常运行的两行代码,执行逻辑是完全拆分的:
- 第一行通过
Enumerable.Range().Select().ToList()生成一个新的List<int>对象,赋值给testList变量 - 第二行单独调用
testList.Sort(),这行代码不需要接收返回值(它本身也没有返回值),只是对已经存在的testList对象做内部元素顺序调整,所以不会触发错误。
而你写的单行链式代码,实际执行逻辑可以拆解为:
// 先执行到ToList(),生成临时列表 var temp = Enumerable.Range(0, 19).Select(r => rand.Next(100)).ToList(); // 再调用临时列表的Sort()方法,拿到的是void结果,尝试赋值给testList3 var testList3 = temp.Sort();
不管你是用var隐式声明变量,还是显式声明为List<int>类型,本质都是尝试把"无返回值"的结果赋值给列表类型的变量,必然会触发类型不匹配的编译错误。
单行实现的正确写法
如果要保持链式调用的单行写法,应该使用LINQ提供的OrderBy方法:这个方法不会修改原集合,会返回排序后的枚举结果,最后调用ToList()就能得到排序完成的列表:
var testList3 = Enumerable.Range(0, 19) .Select(r => rand.Next(100)) .OrderBy(num => num) .ToList();
如果一定要用原地排序的Sort()方法,也可以写扩展方法做包装,但日常开发场景下OrderBy的写法可读性更强,也更符合链式调用的设计逻辑。
内容的提问来源于stack exchange,提问作者HedgePig
相关产品推荐
相关产品推荐

