代码之家  ›  专栏  ›  技术社区  ›  RickL

当使用接口而不是实际类型时,如何重写operator==?

  •  1
  • RickL  · 技术社区  · 14 年前

    我有这样的代码:

    我应该如何实现操作符==以便在变量为接口IMyClass时调用它?

    public class MyClass : IMyClass
    {
        public static bool operator ==(MyClass a, MyClass b)
        {
            if (ReferenceEquals(a, b))
                return true;
    
            if ((Object)a == null || (Object)b == null)
                return false;
    
            return false;
        }
    
        public static bool operator !=(MyClass a, MyClass b)
        {
            return !(a == b);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            IMyClass m1 = new MyClass();
            IMyClass m2 = new MyClass();
    
            MyClass m3 = new MyClass();
            MyClass m4 = new MyClass();
    
            Console.WriteLine(m1 == m2); // does not go into custom == function. why not?
            Console.WriteLine(m3 == m4); // DOES go into custom == function
        } 
    }
    
    3 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    关键是你不是 接线员-你是 超载 是的。

    没有为定义运算符

    operator ==(IMyClass x, IMyClass y)
    

    所以编译器没有它可以调用的东西。它不能打电话

    operator ==(MyClass x, MyClass y)
    

    因为它不知道 m1 m2 MyClass .

    据我所知,没有办法实现一个用于接口的操作符——毕竟,多个实现都可以提供自己的一个操作符,只是为了一个可能的模糊点。

    IEqualityComparer<IMyClass> 用它来代替。

        3
  •  -3
  •   apoorv020    14 年前

    推荐文章