相关疑难解决方法(0)

IEquatable与重写Object.Equals()有什么区别?

我希望我的Food类能够在它等于另一个实例时进行测试Food.我稍后会对List使用它,我想使用它的List.Contains()方法.我应该实施IEquatable<Food>还是仅仅覆盖Object.Equals()?来自MSDN:

此方法通过使用默认的相等比较器来确定相等性,由对象的T的IEquatable.Equals方法的实现(列表中的值的类型)定义.

所以我的下一个问题是:.NET框架的哪些函数/类可以使用Object.Equals()?我应该首先使用它吗?

.net c# equality equals iequatable

168
推荐指数
3
解决办法
6万
查看次数

EqualityComparer &lt;T&gt; .Default不返回派生的EqualityComparer

我有一个Person类,并创建了一个从EqualityComparer <Person>派生的相等编译器类。但是默认的EqualityComparer不会调用我的相等比较器的Equals函数

根据MSDN EqualityComparer <T> .Default属性

Default属性检查类型T是否实现System.IEquatable接口,如果是,则返回使用该实现的EqualityComparer。否则,它返回一个EqualityComparer,它使用T提供的Object.Equals和Object.GetHashCode的替代。

在下面的(简化)示例中,Person类未实现工具System.IEquatable <Person>。因此,我希望PersonComparer.Default将返回PersonComparer的实例。

但是没有调用PersonComparer.Equals。没有调试输出,返回值为false。

public class Person
{
    public string Name { get; set; }
}

public class PersonComparer : EqualityComparer<Person>
{
    public override bool Equals(Person x, Person y)
    {
        Debug.WriteLine("PersonComparer.Equals called");
        return true;
    }

    public override int GetHashCode(Person obj)
    {
        Debug.WriteLine("PersonComparer.GetHasCode called");
        return obj.Name.GetHashCode();
    }
}

public static void Main()
{
    Person x = new Person() { Name = "x" };
    Person y = new Person() { Name = "x" };
    bool …
Run Code Online (Sandbox Code Playgroud)

c# iequalitycomparer

5
推荐指数
1
解决办法
290
查看次数

标签 统计

c# ×2

.net ×1

equality ×1

equals ×1

iequalitycomparer ×1

iequatable ×1