开发者

Static extension methods supporting member constraints

开发者 https://www.devze.com 2023-01-15 07:07 出处:网络
I need to implement a static extension method supporting member constraints on some basic primitive types like integers, floats, etc. Here\'s my code for signe开发者_StackOverflowd integers:

I need to implement a static extension method supporting member constraints on some basic primitive types like integers, floats, etc. Here's my code for signe开发者_StackOverflowd integers:

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

Test code:

open MyOperators    
let x = foo 5 // x should be 7

But compiler complains with error:

The type 'System.Int32' does not support any operators named 'Foo'

What am I missing here? Thanks!


Static member constraints in F# never find 'extension methods', they can only see intrinsic methods on types (and a few special cases called out in the F# language spec).

Perhaps you can use method overloading instead? What is your ultimate goal?


F#'s static type constraints don't work with extension methods. Extension methods cannot statically be checked at compile time, and even so, you can have multiple definitions for Int32::Foo (depending on which namespace you imported).

Unfortunately, to solve your problem you might have to resort to using reflection.

0

精彩评论

暂无评论...
验证码 换一张
取 消