为什么匿名类不实现 System.IEquatable<T>?

Why do anonymous classes not implement System.IEquatable<T>?

提问人:Bartosz 提问时间:10/28/2023 更新时间:10/28/2023 访问量:44

问:

匿名类(又名匿名类型)由 C# 编译器隐式创建和使用,用于如下代码:

var obj = new { X1 = 0, X2 = 1 };

它们具有值相等语义,即重写类中的方法以执行逐字段比较。具有值相等语义的典型 C# 类或结构实现接口。关于如何实现相等的官方指南也断言,“类和结构都需要相同的基本步骤来实现相等:bool Equals(object? obj)objectTSystem.IEquatable<T>

  1. 重写该方法。在大多数情况下,您的实现应该只调用特定于类型的方法,即接口的实现。(请参阅步骤 2。virtual Object.Equals(Object)bool Equals(object obj)EqualsSystem.IEquatable<T>

  2. 通过提供特定于类型的方法实现接口。System.IEquatable<T>Equals

但是,匿名类被编译为如下内容:

internal sealed class AnonymousType<T1, T2> {
    public T1 X1 { get; }
    public T2 X2 { get; }

    public AnonymousType(T1 x1, T2 x2) { X1 = x1; X2 = x2; }

    public override bool Equals(object? obj) {
        var other = obj as AnonymousType<T1, T2>;
        return this == other || (other != null &&
            EqualityComparer<T1>.Default.Equals(X1, other.X1) && 
            EqualityComparer<T2>.Default.Equals(X2, other.X2));
    }
    public override int GetHashCode() { /* code omitted */ }
    public override string ToString() { /* code omitted */ }
}

我希望它们看起来更像这样:

internal sealed class AnonymousType<T1, T2> : IEquatable<AnonymousType<T1, T2>> {
    public T1 X1 { get; }
    public T2 X2 { get; }

    public AnonymousType(T1 x1, T2 x2) { X1 = x1; X2 = x2; }

    public bool Equals(AnonymousType<T1, T2>? other) =>
        this == other || (other != null &&
        EqualityComparer<T1>.Default.Equals(X1, other.X1) && 
        EqualityComparer<T2>.Default.Equals(X2, other.X2));

    public override bool Equals(object? obj) =>
        Equals(obj as AnonymousType<T1, T2>);
    public override int GetHashCode() { /* code omitted */ }
    public override string ToString() { /* code omitted */ }
}

也许,我还会添加 and 运算符。(指南说这是“可选的,但建议”。==!=

匿名类不实现,违反上述准则有什么具体原因吗?IEquatable<T>

C# 相等性 类型匿名

评论


答: 暂无答案