如何在F#中定义编译时类型转换运算符?

时间:2012-01-15 16:55:50

标签: f# casting operators compile-time

假设:

let ab = ArgumentBlockSettingStore()
let a  = ab :> ISettingStore

有没有办法定义前缀运算符(~~)以便

let ab, a = ~~ArgumentBlockSettingStore() : _ * ISettingStore

成为可能?

1 个答案:

答案 0 :(得分:2)

我认为你正在达到你在评论中提到的编译器限制 - 你不能以完全通用和安全的方式编写~~运算符,这意味着它只允许转换为接口参数实现。您可以定义一个将转换为任何其他类型的运算符,但这样做不太安全:

let inline (~~) (a:^T) : ^T * ^R = a, (box a) :?> ^R

let reader, (disposable:IDisposable) = ~~(new StreamReader("..."))

我使用inline,因为运算符非常简单,但它与普通运算符的工作方式相同。即使您在Random的类型注释中使用disposable,也会进行编译,这有点不幸。