CA1066: Implement IEquatable when overriding Equals (code analysis) - .NET (original) (raw)
Property | Value |
---|---|
Rule ID | CA1066 |
Title | Implement IEquatable when overriding Equals |
Category | Design |
Fix is breaking or non-breaking | Non-breaking |
Enabled by default in .NET 9 | No |
Cause
A value type (struct) overrides Equals method, but does not implement IEquatable.
Rule description
A value type overriding Equals method indicates that it supports comparing two instances of the type for value equality. Consider implementing the IEquatable interface to support strongly typed tests for equality. This ensures that callers performing equality checks invoke the strongly typed System.IEquatable.Equals method and avoid boxing the argument, improving performance. For more information, see Notes to implementers.
Your System.IEquatable.Equals implementation should return results that are consistent with Equals.
How to fix violations
To fix a violation, implement IEquatable and update Equals override to invoke this implemented method. For example, the following two code snippets show a violation of the rule and how to fix it:
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
When to suppress warnings
It is safe to suppress violations from this rule if the design and performance benefits from implementing the interface are not critical.
Suppress a warning
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
To disable the rule for a file, folder, or project, set its severity to none
in the configuration file.
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
For more information, see How to suppress code analysis warnings.