Как определить операторы приведения типов во время компиляции в F #? - PullRequest
1 голос
/ 15 января 2012

Учитывая:

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

Есть ли способ определить префиксный оператор (~~), чтобы

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

стало возможным?

1 Ответ

2 голосов
/ 15 января 2012

Я думаю, что вы нарушаете ограничения компилятора, которые вы упомянули в комментарии - вы не можете написать оператор ~~ полностью универсальным и безопасным способом, означающим, что он разрешит приведение только к интерфейсу, который реализует аргумент,Вы можете определить оператор, который будет приводить к любому другому типу, но это менее безопасно:

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

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

Я использовал inline, потому что оператор довольно прост, но он работаетТочно так же с обычными операторами.Это компилируется, даже если вы используете Random в аннотации типа для disposable, что немного неудачно.

...