提问人:Bartosz 提问时间:10/28/2023 更新时间:10/28/2023 访问量:44
为什么匿名类不实现 System.IEquatable<T>?
Why do anonymous classes not implement System.IEquatable<T>?
问:
匿名类(又名匿名类型)由 C# 编译器隐式创建和使用,用于如下代码:
var obj = new { X1 = 0, X2 = 1 };
它们具有值相等语义,即重写类中的方法以执行逐字段比较。具有值相等语义的典型 C# 类或结构实现接口。关于如何实现相等的官方指南也断言,“类和结构都需要相同的基本步骤来实现相等:bool Equals(object? obj)
object
T
System.IEquatable<T>
重写该方法。在大多数情况下,您的实现应该只调用特定于类型的方法,即接口的实现。(请参阅步骤 2。
virtual Object.Equals(Object)
bool Equals(object obj)
Equals
System.IEquatable<T>
通过提供特定于类型的方法实现接口。
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>
答: 暂无答案
评论