.net 为什么要用CustomEqualityAttribute标记我的类型?
我定义了自己的类.net 为什么要用CustomEqualityAttribute标记我的类型?,.net,f#,.net,F#,我定义了自己的类 type public Observation(?values) = ... 它覆盖对象。等于 override o1.Equals o2 = let isEqual = ... isEqual 并进一步编写了一个单元测试,它使用全局运算符=和。我已验证是否确实调用了重写的Equals 那么用[]标记我的类有什么意义呢?如果我不添加该属性,我是不是在为自己设置一个讨厌的bug?不幸的是,此属性上的属性没有太多说明。一个原因
type public Observation(?values) =
...
它覆盖对象。等于
override o1.Equals o2 =
let isEqual = ...
isEqual
并进一步编写了一个单元测试,它使用全局运算符=
和
。我已验证是否确实调用了重写的Equals
那么用
[]
标记我的类有什么意义呢?如果我不添加该属性,我是不是在为自己设置一个讨厌的bug?不幸的是,此属性上的属性没有太多说明。一个原因可能是添加[]
会强制您重写对象。Equals
。如果没有该属性,删除Equals
方法将更改运行时行为,而添加该属性将强制使用equality方法,如果缺少该方法,将导致编译错误
为了确认为什么需要[]
,我在规范中查找了它,其中说明
习俗平等
§类型必须具有重写的显式实现
等于(obj:obj)
[]
属性存在的理由来自于你必须使用它的情况,而不是像你这样你可以使用它的情况。前者的一个非常简单的例子是
type Strange = Behavior of (int -> int)
let a = Behavior (fun x -> x + 1)
let b = Behavior (fun x -> x + 1)
a = b
b = b
编译器将对任何使用=
的尝试发出吠声,因为奇怪的
的匿名函数元素根本不支持任何等式约束
关于奇怪
类型值相等的选项有:
- 或者永远不要检查
类型的值是否相等,无需为此默认选择使用任何属性奇怪
- 或者通过向类型声明中添加
来选择引用相等[]
- 或者,当您必须将
添加到类型声明中,并显式重写[]
和Equals
成员,和/或实现GetHashCode
或System.IEquatable
System.Collections.isstructuralequatable
你可以在中找到关于F#等式和比较约束的扩展解释。我完全赞成引用规范,但规范如此简洁的事实似乎在向我提出一个问题——覆盖等于和要求覆盖等于优于覆盖等于的优点是什么?可能重复