Comment utiliser un object C # à partir de F #?

J’ai le code C # suivant.

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

Et je suis venu avec le code F # nommé testcs.fs pour utiliser cet object.

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

Quand j’exécute la commande suivante

 fsc -r: MyMath.dll testcs.fs

J’ai eu ce message d’erreur.

 /Users/smcho/Desktop/cs/namespace/testcs.fs(1,13): erreur FS0039: l'espace de noms 'Arith' est 
 non défini

 /Users/smcho/Desktop/cs/namespace/testcs.fs(3,9): erreur FS0039: la valeur ou le constructeur 
 'Ajouter' n'est pas défini

Quel est le problème? J’ai utilisé mono pour l’environnement .NET.

essayer

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

Arith dans votre code est le nom de la classe, vous ne pouvez pas l’ouvrir comme un espace de noms. Peut-être avez-vous des difficultés à ouvrir les modules F # afin que ses fonctions puissent être utilisées sans réserve

Comme Arith est une classe et non un espace de noms, vous ne pouvez pas l’ouvrir. Vous pouvez le faire à la place:

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

Avec open, vous ne pouvez ouvrir que les espaces de noms qui sont des modules (de la même manière que le mot-clé utilisant C #). Les espaces de noms sont définis avec le mot clé namespace et agissent de la même manière en C # et en F #. Cependant, les modules ne sont en fait que des classes statiques, n’ayant que des membres statiques – F # vous le cache.

Si vous regardez un code F # avec le réflecteur, vous verrez que votre module a été compilé en tant que classe statique. Pour cette raison, vous ne pouvez utiliser que des classes statiques en tant que modules dans F #. Dans votre exemple, la classe n’est pas statique. Pour l’utiliser, vous devez donc créer une instance d’object, comme vous le feriez en C #.