Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 平等比较公司<;T>;。默认误解?_C#_.net 4.0_Iequalitycomparer - Fatal编程技术网

C# 平等比较公司<;T>;。默认误解?

C# 平等比较公司<;T>;。默认误解?,c#,.net-4.0,iequalitycomparer,C#,.net 4.0,Iequalitycomparer,我有一个类Person,它实现了IEquatable中的Equals()方法(还覆盖了对象。Equals方法,让我们暂时忽略GetHashcode()方法) 但是我是个程序员!我永远不会发送一个对象,而实际上它是一个人 我错过了什么?我很难理解EqualityComparer.Default的好处。有人能给我举个例子来证明我错了吗?如果您传入null作为第二个参数,或者如果您根本不传入第二个参数(基本相同),SequenceEquals的实现将调用EqualityComparer.Default

我有一个类
Person
,它实现了
IEquatable
中的Equals()方法(还覆盖了
对象。Equals
方法,让我们暂时忽略GetHashcode()方法)

但是我是个程序员!我永远不会发送一个
对象
,而实际上它是一个


我错过了什么?我很难理解
EqualityComparer.Default
的好处。有人能给我举个例子来证明我错了吗?

如果您传入
null
作为第二个参数,或者如果您根本不传入第二个参数(基本相同),SequenceEquals的实现将调用
EqualityComparer.Default本身(可反编译
枚举
)。这就解释了为什么无论是否提供
EqualityComparer.Default
,您都看不出有什么区别


因此,最后,第二个参数只有在您希望使用除
EqualityComparer.Default

之外的相等比较器时才有意义,您可以传入
IEqualityComparer.Default
是的一个效果,添加在.NET 4中

本质上,只要需要
IEqualityComparer
,就可以使用
IEqualityComparer
,其中
DerivedType:BaseType
。由于
Person
源自
Object
,这意味着只要需要
IEqualityComparer
,就可以使用
IEqualityComparer

答案如下:

对于值类型,应始终实现IEquatable并重写Object.Equals(Object)以获得更好的性能。Equals框值类型,并依赖反射来比较两个值是否相等。Equals的实现和Object.Equals的重写都应该返回一致的结果


如果您不重写Equals和GetHashCode,EqualityComparer.Default实际上会为您解决这个问题。

您不明白什么?实例化
IEqualityComparer.Default
的好处,或者为什么您可以选择特定的实例化,或者其他什么?为什么它可以使用或不使用它,为什么我有理由用typeBoxing调用它只对值类型发生。由于
Person
是一个引用类型,因此本例中不涉及装箱。@您不能执行的循环
bool b=lst1.SequenceEqual(lst2,EqualityComparer.Default)因为它需要:t源类型。来源是人。看起来对发生的事情有很大的误解。如果我们把它带到C#聊天室也许会更好…为什么我会用它来与它进行比较呢?你可能想实现你自己的iQualityComparer,例如,如果你用它来表示一个T,它没有按照你所需要的方式实现相等。我只被告知值类型-所以我想我必须构建一个我似乎不理解的结构。请详细说明您正在尝试执行的操作。这是因为它是
反变的。当对象比较器是一个人时,我为什么要使用它?另外,我听说它有避免拳击的优点。哪种拳击?类似于:“如果你有Iequatable Equals方法,我将使用它,而不是Object.Equals方法”…这里是什么地方?在这个特定的例子中,通用的逆变法并没有那么有用,但是在某些情况下它确实非常有用。仅仅因为你能做某事并不意味着这样做是正确的。
class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}
Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
EqualityComparer<Person>.Default
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);