When implementing operator overloads, it is very important to make sure that all related operators and methods are consistent in their
implementation.
The following guidelines should be followed:
- When providing
operator ==
you should also provide operator !=
and vice-versa.
- When providing
operator ==
you should also provide Equals(Object)
and GetHashCode()
.
- When providing
operator +, -, *, / or %
you should also provide operator ==
, respecting previous guidelines.
This rule raises an issue when any of these guidelines are not followed on publicly-visible type (public, protected or protected internal).
Noncompliant code example
using System;
namespace MyLibrary
{
public class Foo // Noncompliant
{
private int left;
private int right;
public Foo(int l, int r)
{
this.left = l;
this.right = r;
}
public static Foo operator +(Foo a, Foo b)
{
return new Foo(a.left + b.left, a.right + b.right);
}
public static Foo operator -(Foo a, Foo b)
{
return new Foo(a.left - b.left, a.right - b.right);
}
}
}
Compliant solution
using System;
namespace MyLibrary
{
public class Foo
{
private int left;
private int right;
public Foo(int l, int r)
{
this.left = l;
this.right = r;
}
public static Foo operator +(Foo a, Foo b)
{
return new Foo(a.left + b.left, a.right + b.right);
}
public static Foo operator -(Foo a, Foo b)
{
return new Foo(a.left - b.left, a.right - b.right);
}
public static bool operator ==(Foo a, Foo b)
{
return (a.left == b.left && a.right == b.right);
}
public static bool operator !=(Foo a, Foo b)
{
return !(a == b);
}
public override bool Equals(Object obj)
{
Foo a = obj as Foo;
if (a == null)
return false;
return this == a;
}
public override int GetHashCode()
{
return (this.left * 10) + this.right;
}
}
}