为什么我们不被允许为记录执行以下操作?
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
}
}
虽然对于类而言,这是完全可以接受的?
abstract class AA
{
public abstract bool Equals(AA other);
}
class BB:AA
{
public override bool Equals(AA other)
{
//do some thing
}
}
顺便说一下,我正在进行这个实现以强制执行Equals检查至其派生类。
编辑:为了说明我为什么对此感兴趣,因为我目前正在创建一个IEquatable的库/自动生成器。
编辑/信息2:根据评论,我进行了一些测试。由于记录的抽象Equals方法无法被覆盖,所以我尝试将其保留为原样。
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; }
}
我得到了一个错误的结果:System.BadImageFormatException: 糟糕的IL格式。
总之,对于记录而言,抽象Equals方法不仅是不必要的实现,而且是一种不好的实现。
public bool Equals(AA other)
,这会导致错误。但在派生记录中创建public virtual bool Equals(BB other)
是有效的。 - Andrii Litvinovpublic abstract bool Equals(AA other);
不仅是记录类型中不必要的实现,而且还是一个糟糕的实现。 - Marlon Dumal-isEquals
添加到抽象记录会改变任何我测试过的情况下的行为。这可能会产生误导,但并不真正有害。我还建议不要为记录使用基础记录,因为当比较记录时,如果两个不同的派生类型导致由于底层转换而比较一个记录和null
。 - Andrii Litvinov