2010-10-10 12 views
13

Mam następujący kod C#.Jak używać obiektu C# z F #?

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

I wymyśliłem kod F # o nazwie testcs.fs, aby użyć tego obiektu.

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

Kiedy uruchomić następującą komendę

 
fsc -r:MyMath.dll testcs.fs 

Mam ten komunikat o błędzie.

 
/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 

Co może być nie tak? Użyłem mono dla środowiska .NET.

Odpowiedz

15

spróbować

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

Arith w kodzie jest nazwa klasy, nie można go otworzyć jak nazw. Być może jesteś zdezorientowany z możliwością otwierania modułów F #, więc jego funkcje mogą być używane bez kwalifikacji.

+0

Działa dobrze. Dzięki. – prosseek

7

Ponieważ jest klasą, a nie przestrzenią nazw, nie można jej otworzyć. Można to zrobić w zamian:

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

Działa dobrze. Dzięki. – prosseek

3

Otwarte, możesz tylko otwierać przestrzenie nazw są modułami (podobnie jak słowo kluczowe C# przy użyciu). Obszary nazw są zdefiniowane za pomocą słowa kluczowego namespace i działają tak samo w C# i F #. Jednak moduły są w rzeczywistości tylko statycznymi klasami mającymi tylko statyczne elementy - F # po prostu ukrywa to przed tobą.

Jeśli spojrzysz na kod F # z reflektorem, zobaczysz, że Twój moduł został skompilowany jako klasa statyczna. Z tego powodu możesz używać tylko klas statycznych jako modułów w F #, aw twoim przykładzie klasa nie jest statyczna, więc aby z niej skorzystać, musisz utworzyć instancję obiektu - tak jak robisz to w C#.