代码之家  ›  专栏  ›  技术社区  ›  Kris Craig

为什么Comparer不支持C#中lambda操作的64位(长)委托返回类型?

  •  0
  • Kris Craig  · 技术社区  · 1 年前

    我试图在C#中创建一个优先级队列,该队列由按DESCENDING顺序排列的64位(长)整数组成。不幸的是,它看起来像。NET不支持这个?

    以下是失败的代码:

    PriorityQueue<long, long> pq = new PriorityQueue<long, long>(Comparer<long>.Create((x, y) => y - x));

    以下是它产生的错误:

    错误CS0266:无法将类型“long”隐式转换为“int”。存在显式转换(是否缺少强制转换?)

    错误CS1662:无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

    应该注意的是,如果我将所有“long”引用都更改为“int”,一切都会完美运行。

    我是否可以在某个地方放置一个角色转换来实现这一点,或者这只是C#出于某种原因不支持的一个基本功能?

    2 回复  |  直到 1 年前
        1
  •  1
  •   Charlieface    1 年前

    不知道你想干什么 y - x ,在某些情况下,这会给你不正确的结果。

    这是错误的,因为你正在返回一个 long ,以及 Compare 期待A int 即:

    • 0 对于相等的值
    • 正,其中x>y
    • 负,其中y>x

    返回反向比较的最简单方法是翻转操作数。将x与y进行比较,而不是相反。

    var comparer = Comparer<long>.Create((x, y) => y.CompareTo(x));
    PriorityQueue<long, long> pq = new PriorityQueue<long, long>(comparer);
    
        2
  •  1
  •   Ivan Petrov    1 年前

    它确实支持它。

    但你需要这样做:

    IComparer<long> comparer = Comparer<long>.Create((x, y) => y == x ? 0 : y > x ? 1 : -1)