C # оператор перегрузки == вне класса - PullRequest
1 голос
/ 11 сентября 2011

У меня есть следующий сценарий:

    public class SomeClass { 
       // Have some other data members as well  
       public int i ; 
    } 

    public class TestClass { 

        public bool SomeFunction() { 
             SomeClass a = new SomeClass(); 
             SomeClass b = new SomeClass(); 
             if (a == b) // this is where I am getting compile error
               return true; 
             return false; 
         } 

        public static bool operator==(SomeClass a, SomeClass b) { 
             if (a.i == b.i)
               return true; 
             // compare some other members as well
             return false; 
        } 
    } 

Можно ли этого достичь в C #?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Нет, невозможно переопределить оператор из класса, который не участвует в операции.


Вы можете создать класс, реализующий IEualityComparer<SomeClass>, который можно использовать вместостандартное сравнение в некоторых случаях, например в словаре:

var x = new Dictionary<SomeClass, string>(new SomeClassEqualityComparer());

Если вы просто хотите использовать сравнение в своем собственном классе, вы можете сделать его обычным статическим методом вместо переопределения оператора:

public static bool SomeClassEqual(SomeClass a, SomeClass b) { 
  if (a.i == b.i) {
    return true;
  }
  // compare some other members as well
  return false; 
}

Использование:

if (SomeClassEqual(a, b))
1 голос
/ 11 сентября 2011

Для начала, вы не можете использовать return true; в методе void.

Во-вторых, операторы переопределения должны применяться к классу хоста.В вашем случае, внутри SomeClass, а не внутри TestClass.

В-третьих, когда вы реализуете оператор переопределения ==, вы должны также реализовать !=.

Вот ваш код, переработанный и работающий:

public class SomeClass
{
    // Have some other data members as well  
    public int i;

    public static bool operator ==(SomeClass a, SomeClass b)
    {
        if (a.i == b.i)
            return true;
        // compare some other members as well
        return false;
    }

    public static bool operator !=(SomeClass a, SomeClass b)
    {
        return !(a == b);
    }
}

public class TestClass
{

    public bool SomeFunction()
    {
        SomeClass a = new SomeClass();
        SomeClass b = new SomeClass();
        if (a == b) // this is where I am getting compile error
            return true;

        return false;
    }
}
...