Why are we not allowed to do the following for a record
abstract record AA
{
public abstract bool Equals(AA other);
}
record BB:AA
{
public override bool Equals(AA other)// error as it is already implemented
{
//do some thing
}
}
while it is totally acceptable for classes?
abstract class AA
{
public abstract bool Equals(AA other);
}
class BB:AA
{
public override bool Equals(AA other)
{
//do some thing
}
}
By the way, I am doing this implementation to enforce the Equals check to cascade to its derived classes.
Edit: just to give context on why am I interested on this is because I am currently creating an library/autogenerator for IEquatable.
Edit/Info 2: Based on the comments, I have done some tests. since the abstract Equals method of record can't be overridden, I tried leaving it as is.
public abstract record AA
{
public int Prop1 { get; set; }
public string? Prop2 { get; set; }
public string? Prop5 { get; set; }
public abstract bool Equals(AA? other);
}
public record BB : AA
{
public string? Prop3 { get; set; }
}
The result I get an error of System.BadImageFormatException: Bad IL format.
All in all, abstract Equals method on records is not just an unnecessary implementation but is also a bad one.