2010-10-10 7 views
13

Tengo el siguiente código C#.Cómo usar el objeto C# de F #?

namespace MyMath { 
    public class Arith { 
     public Arith() {} 
     public int Add(int x, int y) { 
      return x + y; 
     } 
    } 
} 

Y se me ocurrió el código F # llamado testcs.fs para usar este objeto.

open MyMath.Arith 
let x = Add(10,20) 

Cuando ejecute el siguiente comando

 
fsc -r:MyMath.dll testcs.fs 

Tengo este mensaje de error.

 
/Users/smcho/Desktop/cs/namespace/testcs.fs(1,13): error FS0039: The namespace 'Arith' is 
not defined 

/Users/smcho/Desktop/cs/namespace/testcs.fs(3,9): error FS0039: The value or constructor 
'Add' is not defined 

¿Qué podría estar mal? Utilicé mono para entorno .NET.

Respuesta

15

tratar

open MyMath 
let arith = Arith() // create instance of Arith 
let x = arith.Add(10, 20) // call method Add 

Arith en su código es el nombre de clase, no se puede abrir como espacio de nombres. Posiblemente se le confunde con la capacidad de abrir módulos F # para que sus funciones se puedan utilizar sin calificación

+0

Funciona bien. Gracias. – prosseek

7

Dado que Arith es una clase y no un espacio de nombres, no puede abrirlo. Usted puede hacer esto en su lugar:

open MyMath 
let x = Arith().Add(10,20) 
+0

Funciona bien. Gracias. – prosseek

3

Con abierto, solo puede abrir espacios de nombres como módulos (de forma similar a la palabra clave C# using). Los espacios de nombre se definen con la palabra clave namespace, y actúan igual en C# y F #. Sin embargo, los módulos son, de hecho, solo clases estáticas, que tienen solo miembros estáticos: F # solo lo oculta.

Si observa un código F # con el reflector, verá que su módulo ha sido compilado como una clase estática. Por esta razón, solo puede usar clases estáticas como módulos en F #, y en su ejemplo, la clase no es estática, por lo que para poder usarla, debe crear una instancia de objeto, tal como lo haría en C#.

Cuestiones relacionadas