Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么要用CustomEqualityAttribute标记我的类型?_.net_F# - Fatal编程技术网

.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#等式和比较约束的扩展解释。

我完全赞成引用规范,但规范如此简洁的事实似乎在向我提出一个问题——覆盖等于和要求覆盖等于优于覆盖等于的优点是什么?可能重复