Я думаю, что вы нарушаете ограничения компилятора, которые вы упомянули в комментарии - вы не можете написать оператор ~~
полностью универсальным и безопасным способом, означающим, что он разрешит приведение только к интерфейсу, который реализует аргумент,Вы можете определить оператор, который будет приводить к любому другому типу, но это менее безопасно:
let inline (~~) (a:^T) : ^T * ^R = a, (box a) :?> ^R
let reader, (disposable:IDisposable) = ~~(new StreamReader("..."))
Я использовал inline
, потому что оператор довольно прост, но он работаетТочно так же с обычными операторами.Это компилируется, даже если вы используете Random
в аннотации типа для disposable
, что немного неудачно.