Методы статического расширения, поддерживающие ограничения членов
Мне нужно реализовать метод статического расширения, поддерживающий ограничения членов для некоторых базовых примитивных типов, таких как целые числа, числа с плавающей запятой и т. Д. Вот мой код для целых чисел со знаком:
module MyOperators =
let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x))
type System.Int32 with
static member Foo(x : Int32) = 7 // static extension
Тестовый код:
open MyOperators
let x = foo 5 // x should be 7
Но компилятор выдает ошибку:
Тип 'System.Int32' не поддерживает никаких операторов с именем 'Foo'
Что мне здесь не хватает? Спасибо!
2 ответа
Ограничения статических членов в F# никогда не находят "методы расширения", они могут видеть только встроенные методы для типов (и несколько особых случаев, вызываемых в спецификации языка F#).
Возможно, вы можете использовать метод перегрузки вместо этого? Какова ваша конечная цель?
Ограничения статического типа в F# не работают с методами расширения. Методы расширения не могут быть статически проверены во время компиляции, и даже в этом случае вы можете иметь несколько определений для Int32::Foo (в зависимости от того, какое пространство имен вы импортировали).
К сожалению, для решения вашей проблемы вам, возможно, придется прибегнуть к помощи рефлексии.