为何C#的Comparer不支持返回long类型的Lambda委托?
问题解答
错误原因
Comparer<T>.Create方法要求传入的比较器委托必须返回int类型的比较结果:
- 返回正整数表示前者大于后者
- 返回负整数表示前者小于后者
- 返回0表示两者相等
你代码里的y - x因为操作数是long,结果也是long,无法隐式转换为int,这就是触发CS0266和CS1662错误的原因。int版本能运行是因为y-x的结果本身就是int,刚好匹配委托的返回类型。
解决方案
C#的PriorityQueue完全支持存储和排序long类型,只需修正比较器的写法即可:
推荐写法(安全且符合规范)
使用long的CompareTo方法,直接返回符合要求的int结果,同时实现降序逻辑:
PriorityQueue<long, long> pq = new PriorityQueue<long, long>(Comparer<long>.Create((x, y) => y.CompareTo(x)));
不推荐写法(存在溢出风险)
如果非要用减法逻辑,必须显式将结果转为int,但当y - x的结果超出int的取值范围(-231到231-1)时,会导致溢出错误,破坏排序逻辑:
PriorityQueue<long, long> pq = new PriorityQueue<long, long>(Comparer<long>.Create((x, y) => (int)(y - x)));
内容的提问来源于stack exchange,提问作者Kris Craig
相关产品推荐
相关产品推荐

