Методы статического расширения, поддерживающие ограничения членов - PullRequest
5 голосов
/ 10 сентября 2010

Мне нужно реализовать метод статического расширения, поддерживающий ограничения членов для некоторых базовых типов примитивов, таких как целые числа, числа с плавающей запятой и т. Д. Вот мой код для целых чисел со знаком:

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 ]

5 голосов
/ 10 сентября 2010

Статические ограничения-члены в F # никогда не находят «методы расширения», они могут видеть только внутренние методы для типов (и несколько особых случаев, вызываемых в спецификации языка F #).

Возможно, вы можете использовать перегрузку методоввместо?Какова ваша конечная цель?

3 голосов
/ 10 сентября 2010

Ограничения статического типа F # не работают с методами расширения.Методы расширения не могут быть статически проверены во время компиляции, и даже в этом случае вы можете иметь несколько определений для Int32 :: Foo (в зависимости от того, какое пространство имен вы импортировали).

К сожалению, для решения вашей проблемы вам, возможно, придется прибегнуть к помощик использованию отражения.

...