c# - sencillos - ¿Puedo sobrecargar un operador== en una interfaz?
sobrecarga de operadores en c# ejemplos sencillos (4)
Además de la respuesta de CodeInChaos , puede que le interese leer las Pautas para anular la igualdad de igualdad () y el Operador == .
Tengo una interfaz como esta:
public interface IFoo
{
int A {get;}
int B {get;}
}
y tengo varias clases implementando IFoo.
Quiero verificar la igualdad, no en base a la Igualdad de referencia, pero dos IFoos deben considerarse iguales, si tanto A como B son iguales (en realidad estoy revisando una colección de pares de clave-valor enviados a través de WCF, por eso puedo No tengo la equidad de referencia).
Ahora si tengo:
IFoo first = new FooBar1() { A = 1, B = 1};
IFoo second = new FooBar2() { A = 1, B = 1};
if (first == second) {
//this should return true
}
Actualmente, IFoo
es IEquatable<IFoo>
, por lo que FooBar1 y FooBar2 reemplazan a Equals(IFoo other)
, pero eso no es lo que se llama en ==. Estoy buscando en mi código para reemplazar a==b
con a.Equals(b)
todas partes, pero eso no es bueno.
¿Que puedo hacer?
De lo que habla aquí es un detalle de implementación, una Interfaz no debe (no puede) definir cómo se implementa.
No, no puede sobrecargar a un operador en una interfaz, ni asegurarse de que los implementadores lo hagan (ya que la sobrecarga del operador es estática en C #).
Tu mejor opción es lo que has hecho, para que IFoo
herede de IEquatable<IFoo>
y use Equals(IFoo)
No, no puedes. La sobrecarga ==
requiere métodos estáticos en uno de los tipos que usa, y una interfaz no puede contenerlos. Los métodos de extensión tampoco pueden ayudar. Así que en interfaces == siempre está usando la igualdad de referencia.
Tenga en cuenta que a.Equals(b)
lanzará una excepción si a == null.