为什么我会收到堆栈溢出异常?

ako*_*nsu 1 c# stack-overflow

下面是抛出了一个简单的测试程序StackOverflowExceptionEquals被调用.我期望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中产生.