【问题标题】:Comparer create lambda function cannot implicitly convert type CS0029比较器创建 lambda 函数不能隐式转换类型 CS0029
【发布时间】:2017-09-04 19:17:09
【问题描述】:

我正在尝试为这样的数据结构添加比较器:

    private SortedSet<int> sortedScore = new SortedSet<int>(Comparer<int>.Create(
        (a, b) => a > b));

但我得到:CS0029 无法将类型“bool”隐式转换为“int”

这很奇怪,因为 a &gt; b 是布尔值,而不是 int,即使是强制转换也无济于事,但如果我这样做:

    private SortedSet<int> sortedScore = new SortedSet<int>(Comparer<int>.Create(
        (a, b) => a.CompareTo(b)));

我没有收到任何错误,实际上,除此之外的任何内容都会让我遇到与上述相同的错误。那么如何将比较器更改为默认值以外的任何内容?

【问题讨论】:

    标签: c# .net data-structures compiler-errors compare


    【解决方案1】:

    因为IComparer&lt;T&gt; 必须提供方法

    int Compare(T x, T y)
    

    即,它必须返回 int,而不是 bool

    • 如果a &gt; b,它必须返回int &gt; 0
    • 如果a = b,它必须返回0
    • 如果a &lt; b,它必须返回int &lt; 0

    您的第二个示例使用了a.CompareTo(b),它确实返回了所需的int

    如果你想实现自己的逻辑,你可以把 lambda 写成:

    (a, b) => a > b ? +1 : a < b ? -1 : 0
    

    【讨论】:

      【解决方案2】:

      你的数据结构的类型是SortedSet&lt;int&gt;。所以你只能使用的比较器应该实现IComparer&lt;int&gt; 接口。该接口有一个名为Compare 的方法,其签名如下:

      int Compare(int x, int y)
      

      并比较xy 这两个值,并返回一个值,指示一个小于、等于还是大于另一个。有关更多信息,请查看IComparer

      话虽如此,您不能使用返回bool 的方法。这就是您收到此错误消息的原因。

      【讨论】:

        猜你喜欢
        • 2017-10-06
        • 2022-08-23
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2022-07-06
        • 2019-10-03
        • 1970-01-01
        • 2021-06-08
        相关资源
        最近更新 更多