2021-04-28 16:49:39 +02:00
|
|
|
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 ``++operator -++`` 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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
----
|