2010-09-09 26 views
5

que necesito para poner en práctica un método de extensión estática apoyo limitaciones miembros sobre algunos tipos primitivos básicos como números enteros, flotadores, etc. Aquí está mi código de enteros con signo:Los métodos estáticos de extensión de apoyo limitaciones miembros

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 

Código de ensayo:

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

Pero compilador se queja con el error:

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

W ¿Me estoy perdiendo aquí? ¡Gracias!

+0

Si te entiendo correctamente, creo que incluso si puedes hacer esto, no es una idea especialmente buena. El retoque con los mecanismos básicos del lenguaje siempre me ha parecido un antipatrón. Piense en el hecho de que alguien además de usted puede tener que trabajar en este código en algún momento en el futuro. Incluso puede que tenga que mantener este código usted mismo en algún momento en el futuro cuando no haya trabajado en él por un tiempo. Las modificaciones a los tipos intrínsecos pueden conducir a varios "WTF?" momentos. –

Respuesta

5

Las restricciones de miembros estáticos en F # nunca encuentran 'métodos de extensión', solo pueden ver métodos intrínsecos en tipos (y algunos casos especiales mencionados en la especificación de lenguaje F #).

¿Quizás pueda usar la sobrecarga de método en su lugar? ¿Cuál es tu objetivo final?

+0

Gracias. El objetivo principal era agregar mi propio conjunto de elementos intrínsecos a FSharp.Core.Operators, como funciones trigonométricas, etc. – Stringer

3

Las restricciones de tipo estático de F # no funcionan con los métodos de extensión. Los métodos de extensión no pueden verificarse estáticamente en tiempo de compilación, y aún así, puede tener múltiples definiciones para Int32 :: Foo (dependiendo del espacio de nombres que importó).

Desafortunadamente, para resolver su problema puede que tenga que recurrir al uso de la reflexión.

+0

Ok, ya veo, eso parece una buena razón. ¡Gracias! – Stringer

+6

No creo que esto sea técnicamente inviable: los métodos de extensión se comprueban estáticamente en tiempo de compilación (cuando los llama), por lo que también podrían ser aceptados por las restricciones de los miembros. Tiene sentido que esto no sea compatible, pero debería ser posible ... –

+0

Buena llamada, mi mal. –

Cuestiones relacionadas