我有一个愚蠢的怀疑。通常“System.Object”实现“Equals”。当我实现 IEquatable 接口(interface)我可以为我的“等于”提供自定义定义(我相信如此)。
所以教授类的实现等于
class Professor:System.Object,IEquatable
既然 System.Equals 和 IEquatable 的 Equals 有不同的定义,为什么 C# 没有报告错误?因为我没有覆盖“Equals”,甚至没有使用 new 关键字隐藏“Equals”。
class Professor : IEquatable<Professor>
{
public string Name { get; set; }
public bool Equals(Professor cust)
{
if (cust == null) return false;
return cust.Name == this.Name;
}
}
最佳答案
你既没有覆盖也没有隐藏Object.Equals()
因为您的版本将 Professor 作为参数类型 - 而不是对象。你是 overloading Equals() 方法。
C# 允许两个具有相同名称的方法在它们接受的参数类型上有所不同。这称为重载 - 它可以被视为编译时多态性。
Overriding (您可以,也可能应该这样做)从基类中的版本更改方法的实现。它是运行时类型多态性的基础。
Hiding 是一种不太常见的技术,它允许派生类屏蔽基类中方法的一个版本。根据调用的引用类型,您可以获取基类版本(如果通过基类引用调用)或派生类版本(如果通过派生类型调用)引用)。
关于你的第二个问题,你应该使用 IEquatable<T>
当存在用于比较与引用相等性不同的两个实例的“相等性”的语义时。
你应该实现 IComparable
或 IComparable<T>
当有订购元素的语义时。这意味着它们可以小于、大于或相等。
关于c# - .NET 中 "equals"的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596502/