You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:47:10