2010-10-10 13 views
13

Ho il seguente codice C#.Come utilizzare l'oggetto C# da F #?

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

E ho trovato il codice F # nome testcs.fs per utilizzare questo oggetto.

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

quando ho eseguito il seguente comando

 
fsc -r:MyMath.dll testcs.fs 

ho ricevuto questo messaggio di errore.

 
/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 

Cosa potrebbe essere che non va? Ho usato mono per ambiente .NET.

risposta

15

provare

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

Arith nel codice è il nome della classe, non è possibile aprirlo come spazio dei nomi. Forse sei confuso dalla possibilità di aprire i moduli F # in modo che le sue funzioni possano essere utilizzate senza qualificazione

+0

Funziona bene. Grazie. – prosseek

7

Poiché Arith è una classe e non uno spazio dei nomi, non è possibile aprirlo. Si può fare questo, invece:

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

Funziona perfettamente. Grazie. – prosseek

3

Con open, è possibile aprire solo spazi dei nomi come moduli (in modo simile al C# utilizzando la parola chiave). I namespace sono definiti con la parola chiave namespace e agiscono allo stesso modo sia in C# che in F #. Tuttavia, i moduli sono in realtà solo classi statiche, con solo membri statici - F # nasconde proprio questo.

Se si guarda un codice F # con il riflettore, si vedrà che il modulo è stato compilato come classe statica. Per questo motivo è possibile utilizzare solo classi statiche come moduli in F # e, nel tuo esempio, la classe non è statica, quindi per poterlo utilizzare devi creare un'istanza di oggetto, proprio come faresti in C#.