gpt4 book ai didi

c# - 为什么比较运算符不会自动重载 IComparable?

转载 作者:太空狗 更新时间:2023-10-30 00:23:22 24 4
gpt4 key购买 nike

当一个类是 IComparable , 那么我们就知道了重载 < 的一切, >==运营商由于 CompareTo功能,对吧?那为什么这些不自动重载呢?

看看下面的例子:

public class MyComparable : IComparable<MyComparable>
{
public int Value { get; }
public MyComparable(int value) { Value = value; }

public int CompareTo(MyComparable other) => Value.CompareTo(other.Value);
}

我想知道为什么默认情况下这样的东西不起作用:

MyComparable obj1 = new MyComparable(1),
obj2 = new MyComparable(2);

if (obj1 < obj2) { /*...*/ }

我们知道obj1 < obj2 == true因为我们实现了 CompareTo , 但因为 <运算符没有重载,这将不起作用。 (我知道 obj1.CompareTo(obj2) < 0 会给出所需的结果,但在大多数情况下不太明显。)

只有当我将下面的代码添加到类中时,它才会按我预期的方式工作:

public static bool operator <(MyComparable x, MyComparable y) => x.CompareTo(y) < 0;
public static bool operator >(MyComparable x, MyComparable y) => x.CompareTo(y) > 0;

// And for equality:
public static bool operator !=(MyComparable x, MyComparable y) => !(x == y);
public static bool operator ==(MyComparable x, MyComparable y)
{
if (ReferenceEquals(x, y)) return true;
if (((object) x == null) || ((object) y == null)) return false;
return x.CompareTo(y) == 0;
}

这是非常通用的功能,那么默认情况下这些比较在每个 IComparable 上不起作用的原因是什么? ?

最佳答案

When a class is IComparable, then we know everything to overload the <, > and == operators due to the CompareTo functionality, right?

是的。

我和你一样沮丧。你的提示在我列出的关于 C# 的十件事中排在第九位。

http://www.informit.com/articles/article.aspx?p=2425867

Then why aren't these overloaded automatically?

默认情况下不实现功能,必须有理由将其删除。相反,需要设计、指定、实现、测试、记录和交付功能。如果这些事情之一没有发生,则没有功能。

对于您想要的功能,这些事情都没有发生。该功能已被提出,但从未接近语言设计团队时间最佳用途列表的首位。

如果您非常想要这个功能,您可以随时在 Roslyn Github 论坛上宣传它,也许有一天它会实现。

关于c# - 为什么比较运算符不会自动重载 IComparable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39860557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com