Я не думаю, что есть способ сделать это статическим способом. Проблема заключается в том, что члены расширения (например, если вы добавили op_Equality
в качестве расширения) игнорируются статическими ограничениями членов (например, если вы также переопределили =
, используя inlin
с op_Equality
требование).
Компилятор F # обладает некоторыми специальными возможностями, доступными только при компиляции FSharp.Core.dll, которые могут помочь (поиск источников для объявления let inline GenericOne
). Он использует что-то вроде статического переключателя типа - но простые смертные не могут получить к нему доступ.
Итак, у меня нет никакой идеи лучше, чем использовать динамическое тестирование типов, что на самом деле не очень хороший подход, и, вероятно, лучше определить пользовательский оператор для сравнения ваших интерфейсов.
Для справки, уродливый динамический подход будет:
let inline (=) a b =
match a, b with
| :? IFoo as a, :? IFoo as b -> yourEquals a b
| _ -> a = b