gpt4 book ai didi

c# - 为什么使用泛型的 "Equals"方法解析与显式调用不同

转载 作者:行者123 更新时间:2023-11-30 12:57:28 24 4
gpt4 key购买 nike

我有以下示例:

namespace ComparisonExample
{
class Program
{
static void Main(string[] args)
{
var hello1 = new Hello();
var hello2 = new Hello();

// calls Hello.Equals
var compareExplicitly = hello1.Equals(hello2);

// calls Object.Equals
var compareWithGenerics = ObjectsEqual<Hello>(hello1, hello2);
}

private static bool ObjectsEqual<TValue>(TValue value1, TValue value2)
{
return value1.Equals(value2);
}
}

class Hello : IEquatable<Hello>
{
public bool Equals(Hello other)
{
return true; // doesn't matter
}
}
}

问题是为什么在第二个“Equals”调用中我被重定向到 Object.Equals 而不是 Hello.Equals,即使我在泛型参数中指定了确切的类型?

最佳答案

因为你还没有告诉泛型方法你的对象实现了IEquatable<T> :

现在试试:

private static bool ObjectsEqual<TValue>(TValue value1, TValue value2) 
where TValue : IEquatable<TValue> // IMPORTANT!!!
{
return value1.Equals(value2);
}

在你的ObjectsEqual方法,您只能访问 TValue 的方法/属性/字段在 object 中定义的类加上在约束中定义的接口(interface)/基类中定义的方法。无限制 => 您只能访问 Equals(object) , GetHashCode() , GetType() ,(如果你有约束class:operator==operator!=。)这两个是虚拟的(Equals(object)GetHashCode()),所以你将使用“正确”版本,第三个是通常不会被覆盖(GetType()),因此您可能会使用“正确”版本。只有两个运算符==/!=经常被覆盖,你瞧!在您的通用方法中,您不能使用两者的“正确”版本! :-)

关于c# - 为什么使用泛型的 "Equals"方法解析与显式调用不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071634/

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