假设:
let ab = ArgumentBlockSettingStore()
let a = ab :> ISettingStore
有没有办法定义前缀运算符(~~)
以便
let ab, a = ~~ArgumentBlockSettingStore() : _ * ISettingStore
成为可能?
答案 0 :(得分:2)
我认为你正在达到你在评论中提到的编译器限制 - 你不能以完全通用和安全的方式编写~~
运算符,这意味着它只允许转换为接口参数实现。您可以定义一个将转换为任何其他类型的运算符,但这样做不太安全:
let inline (~~) (a:^T) : ^T * ^R = a, (box a) :?> ^R
let reader, (disposable:IDisposable) = ~~(new StreamReader("..."))
我使用inline
,因为运算符非常简单,但它与普通运算符的工作方式相同。即使您在Random
的类型注释中使用disposable
,也会进行编译,这有点不幸。