F#中为MyInt list自定义扩展+运算符编译失败问题咨询
问题核心原因
F# 的运算符重载解析规则不会扫描 C# 风格扩展方法中定义的静态运算符,只会查找以下两类可访问的加法实现:
- 操作数类型本身定义的固有
op_Addition静态成员 - 当前作用域内可访问的、通过
let绑定定义的inline运算符重载
你能直接调用 op_Addition 是因为该调用走的是普通扩展方法的查找规则,和运算符解析是两套完全独立的逻辑,这就是为什么 z' 能编译,z 不行的根本原因。
正确实现方式
不需要定义扩展方法类,直接在你声明 MyInt 的模块/命名空间下定义作用域内的加法运算符即可,推荐配合 [<AutoOpen>] 特性让运算符自动在引用的地方生效:
// 前文MyInt定义、sumMyInt定义省略 let sumMyInts = List.map2 sumMyInt [<AutoOpen>] module MyIntListOperators = let inline (+) (ss1: MyInt list) (ss2: MyInt list) = sumMyInts ss1 ss2
该实现不会和系统默认的 + 运算符冲突:只有当两个操作数都是 MyInt list 类型时才会命中这个重载,其他类型的加法操作会自动回退到默认实现。修改后你原来的 let z = ns1 + ns2 就可以正常编译运行了。
内容的提问来源于stack exchange,提问作者V0ldek
相关产品推荐
相关产品推荐

