98 lines
2.0 KiB
Plaintext
98 lines
2.0 KiB
Plaintext
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;
|
|
}
|
|
}
|
|
}
|
|
----
|
|
|