首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparable实现

IComparable实现
EN

Stack Overflow用户
提问于 2012-06-15 15:22:40
回答 6查看 280关注 0票数 0

我编写了以下代码

代码语言:javascript
复制
 class Program
{
    static void Main(string[] args)
    {
        Circle c1 = new Circle(5);
        Circle c2 = new Circle(10);
        Console.WriteLine(c1.Area().ToString());
        if (c1>c2)
        {
        }
    }
}
public class Circle:System.IComparable<Circle>,IComparable
{
    public int radius { get;private set; }
    public double Area()
    {
        return Math.PI * radius * radius;
    }
    public Circle(int radius)
    {
        this.radius = radius;
    }
    public int CompareTo(Circle c)
    {
        if (c.Area() == this.Area())
            return 0;
        if (c.Area() > this.Area())
            return 1;
        return -1;
    }
    public int CompareTo(Object c)
    {
        if (((Circle)c).Area() == this.Area())
            return 0;
        if (((Circle)c).Area() > this.Area())
            return 1;
        return -1;
    }
}

但是,错误1运算符'>‘不能应用于类型为'ConsoleApplication1.Circle’和'ConsoleApplication1.Circle‘的操作数

我已经实现了这两个方法,但无法计算出错误

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-06-15 15:40:16

实现IComparable本身并不会为类创建>、>=、<、<=运算符。如果您希望这些运算符可用于您的类,则必须实现它们:

代码语言:javascript
复制
public static bool operator > (Circle x, Circle y) {
   return x.CompareTo(y) > 0;
}

// and so on for the other operators

如果您决定创建这些运算符,您可能还希望重载.Equals方法和==运算符,以便您的Circle对象在实践中将在比较运算下表现出值类型行为。

此外,由于面积与半径成正比,因此您可以很好地比较半径(?拼写)而不是区域。

票数 1
EN

Stack Overflow用户

发布于 2012-06-15 15:24:50

您需要重载>操作符才能完成您正在尝试的操作:

代码语言:javascript
复制
  public static bool operator > (Circle c1, Circle c2)
  {
     return (c1.CompareTo(C2) > 0);
  }  
票数 6
EN

Stack Overflow用户

发布于 2012-06-15 16:13:48

实现IComparableIComparable<T>不会自动启用比较运算符。您必须专门提供它们的实现。大多数其他答案(在本答案的时候)提供了不正确或不完整的运算符实现。

您需要首先修复您的CompareTo实现。第一个修复方法是确保您处理null的情况。对象始终根据规范(see docs)进行大于null的比较:

代码语言:javascript
复制
public int CompareTo(Circle c)
{
    return c == null ? 1 : CompareAreas(this.Area(), c.Area());
}
public int CompareAreas(double a, double b)
{
    return a > b ? 1 : a == b ? 0 : -1;
}

CompareTo的非通用版本还需要处理与null的比较,并确保它确实与Circle对象进行比较:

代码语言:javascript
复制
public int CompareTo(Object obj)
{
    if (obj == null) return 1;
    var c = obj as Circle;
    if (c == null) throw new ArgumentException(null, "obj");
    return CompareTo(c); // delegate to CompareTo(Circle)
}

最后,><运算符实现需要考虑一端或两端都是null

代码语言:javascript
复制
public static bool operator >(Circle a, Circle b)
{
    return Compare(a, b) > 0;
}
public static bool operator <(Circle a, Circle b)
{
    return Compare(a, b) < 0;
}
public static int Compare(Circle a, Circle b)
{
    return a == null && b == null ? 0 : a == null ? 1 : a.CompareTo(b);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11046285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档