F #: параметры явного типа в привязке оператора

Я пытаюсь определить оператор с явными параметрами и ограничениями типа:

let inline (===)<'a, 'b
    when 'a : not struct
     and 'b : not struct> a b = obj.ReferenceEquals (a,b)

Он хорошо работает в F # 2.0, но создает:

предупреждение FS1189:
Параметры типа должны быть размещены напрямую рядом с именем типа, например." тип C <T> ", а не тип" C <T> "

Итак, каков правильный способ специфицирования аргументов явного типа для определения оператора?

p.s. Пожалуйста, не говорите мне о неявных параметрах типа и некоторых других обходных решениях, я хочу конкретно решить эту проблему.

Ответ 1

Ошибка в компиляторе означает, что символические операторы никогда не рассматриваются непосредственно рядом с параметрами типа. Вы можете обходным путем, например,

let inline myeq<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

let inline (===) a b = myeq a b

Ответ 2

let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b)