为何C#匿名类不实现System.IEquatable<T>?违背准则的原因
为什么C#匿名类不实现System.IEquatable?
匿名类型的“不可引用”特性是核心限制
匿名类的类型名称是编译器自动生成的(类似<>f__AnonymousType0<int,string>这类无法手动写出的名称),开发者在代码里根本没法直接引用这个类型。就算编译器给它实现了IEquatable<GeneratedType>,你也写不出对应的泛型参数来调用类型专属的Equals方法——实现了也用不上,完全没意义。
性能收益与使用场景不匹配
匿名类大多用来临时装数据,比如LINQ查询的中间结果、方法里的临时数据容器,很少会被放到需要高频做相等性比较的场景里。IEquatable<T>带来的装箱优化收益,在这类场景下微乎其微,犯不上为这点收益增加编译的复杂度。
设计以简洁性为优先
编译器生成匿名类的初衷就是给开发者提供一个轻量、快捷的临时数据结构。跳过IEquatable<T>的实现,能简化编译逻辑,减少生成的代码量,而且完全不影响正常使用——毕竟你本来就只能通过object.Equals来比较匿名类实例,而这个方法已经被重写成逐字段比较的值相等语义了。
历史兼容性与设计优先级
匿名类从C# 3.0就有了,当时的核心需求是快速实现“不用定义类就能创建数据对象”的功能,IEquatable<T>属于锦上添花的非必需项。后来也没因为这个设计引发什么普遍问题或性能瓶颈,所以也就没特意追加这个实现。
内容的提问来源于stack exchange,提问作者Bartosz
相关产品推荐
相关产品推荐

