Per the C#9 record proposal, the following should compile, even if not very useful without actual implementations..
// No explicit IEquatable<R> - this is synthesized!
public sealed record SimpleVo
{
// Not virtual, as SimpleVo (R) is sealed.
// Accepts SimpleVo? (R?), and not SimpleVo (R), as argument.
public bool Equals(SimpleVo? other) =>
throw new System.NotImplementedException();
// Optional: warning generated if not supplied when Equals(R?) is user-defined.
public int GetHashCode() =>
throw new System.NotImplementedException();
// No other “standard” equality members!
}
There are restrictions on the equality-related members as most of the code is synthesized. The proposal includes examples of the expected synthesized underlying type.
That is, given just a Equals(R?)
the compiler creates a ==
, !=
, and Equals(object)
.
The methods that can be defined can be found by searching for “user-defined” in the proposal.
Attempting to override/define other equality methods or operators is expected to fail:
It is an error if the override is declared explicitly.
The behavior is discussed in ‘Equality members’ and is summarized in the paragraph:
The record type implements
System.IEquatable<R>
and includes a synthesized strongly-typed overload ofbook Equals(R? other)
where R is the record type. The method is public, and the method is virtual unless the record type is sealed. The [Equals(R?)
] method can be declared explicitly. It is an error if the explicit declaration does not match the expected signature or accessibility, or the explicit declaration doesn’t allow overriding it in a derived type and the record type is not sealed.
IfEquals(R? other)
is user-defined (not synthesized) butGetHashCode
is not [user-defined], a warning is produced.