c# - 比较器创建lambda函数无法隐式转换类型CS0029

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

我正在尝试为数据结构添加一个比较器,如下所示:

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

但是我得到了:CS0029无法将类型'bool'隐式转换为'int'

这很奇怪,因为a > b是 bool(boolean) 值,而不是整数,即使强制转换也无济于事,但是如果我这样做:
    private SortedSet<int> sortedScore = new SortedSet<int>(Comparer<int>.Create(
        (a, b) => a.CompareTo(b)));

我没有收到任何错误,实际上,除此以外,我没有得到与上述相同的错误。那么,如何将比较器更改为默认值以外的其他值?

最佳答案

因为IComparer<T>必须提供一个方法

int Compare(T x, T y)

即,它必须返回int,而不是bool
  • 如果是int > 0,则必须返回一个a > b
  • 如果是0,则必须返回a = b
  • 如果是int < 0,则必须返回一个a < b

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

    如果要实现自己的逻辑,则可以将lambda编写为:
    (a, b) => a > b ? +1 : a < b ? -1 : 0
    

    关于c# - 比较器创建lambda函数无法隐式转换类型CS0029,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43311416/

    相关文章:

    C# 字符串中的 UTF-8 字节位置

    c# - 将依赖的可观察值映射到子列表

    c# - 将 UltraCombo 添加到已格式化的 ToolStrip

    java - 从文件中查找访问次数最多的 URL

    java - 如何实现可见性受限的Java图数据结构和类?

    c# - DbContext 连接字符串和托管服务

    c# - 自定义排序排序

    .net - NHibernate:如何在运行时重新配置映射?

    .net - 什么时候值得使用 BindingSource?

    java - 使用java插入二叉树不起作用