下面是抛出了一个简单的测试程序StackOverflowException时Equals被调用.我期望Equals从对象中获取的泛型可以调用我的IEquatable<MyClass>.Equals,但它没有,它会调用自己.为什么?参数类型似乎没问题.为什么它首先称为通用版本?我很迷惑.
using System;
namespace consapp
{
class Program
{
static void Main(string[] args)
{
MyClass x0 = new MyClass("x0");
MyClass x1 = new MyClass("x");
Console.WriteLine(x1.Equals(x0));
}
}
internal class MyClass : IEquatable<MyClass>
{
public string Name { get; set; }
public MyClass(string s) { this.Name = s; }
public override bool Equals(object x) { return this.Equals(x as MyClass); }
public override int GetHashCode() { return this.Name.ToLowerInvariant().GetHashCode(); }
bool IEquatable<MyClass>.Equals(MyClass x) { return x != null && this.Name == x.Name; }
}
}
Run Code Online (Sandbox Code Playgroud)
Fem*_*ref 10
IEquatable.Equals明确实施.您必须首先将类强制转换为接口以使用显式实现:
public override bool Equals(object x)
{
return (this as IEquatable).Equals(x as MyClass);
}
Run Code Online (Sandbox Code Playgroud)
否则它将继续在无限递归中调用自身,最终在StackoverflowException中产生.