标准=运算符假定两个参数都具有相同的类型,所以我认为没有办法添加适用于不同类型的重载。我认为明智的选择可能是定义一个对运营商.=和=.(类似于运营商如.*和*.通常用于标量乘法与左,右标,分别):
type Foo(n:int) =
member x.N = n
static member (=.) (x:Foo, y:int) = x.N = y
static member (.=) (y:Foo, x:int) = x.N = y
但也许当他们想要比较两个不同类型的值时,明确地要求用户明确地写a.N = y(因为严格来说,相同类型的两个值永远不会相等 - 它们甚至不是相同类型!)
如果您确实想要,您可以重新定义=运算符,但我不会建议(并且,当您使用let定义运算符(=)时,编译器会给出警告,说明通常不建议这样做)。无论如何,它可以用a trick described e.g. here来完成:
type Foo(n:int) =
member x.N = n
// A type that contains all overloads of the `=`
// operator that you want to support
type Equality = EQ with
static member (?
static member (?
static member (?
// This hides the standard equality operator and can
// lead to all sorts of confusion! (Probably do not do this :-))
let inline (=) x y = (?
10 = 4
Foo(10) = 3
也许你可以使用答案的后半部分中描述的方法定义你自己的操作,但不要隐藏=,而是不同的调用它。然后你可以处理重载(以及标准类型),但你不会隐藏标准定义。