2013-12-08 21 views
7

Przyjrzałem się innym instrukcjom i nadal nie mam pojęcia, jak to zrobić. Mam dwa projekty (Kalkulator w C# i Logika w F #). I dodaje odniesienie do logiki w kalkulator, jak również odniesienie do FSharp.CoreWywołanie funkcji F # z C#

Jednakże kiedy dodać linię

float result = Logic.start(formula); 

W moim projekcie C#, otrzymuję błąd mówiąc:

"Nazwa Logika nie istnieje w bieżącym kontekście."

W projekcie logicznym znajduje się moduł Logic, więc powinien się pokazać poprawnie? Czego jeszcze mi brakuje?

EDIT: Tutaj jest definicja funkcji ...

let start formula = 
core (List.ofSeq formula) [] [] 
+0

Musisz upewnić się, że typ jest publiczny, a metoda jest publiczna. Nie pamiętam z góry mojej głowy, co to robi w F #. Być może po definicji? –

+0

zobaczyć następujące pytanie http://stackoverflow.com/questions/478531/call-f-code-from-c-sharp – Mayank

Odpowiedz

18

Nie można odwołać się od C# tylko moduł F # bez nazw. Zrobić coś takiego:

// F# project 
namespace Some 
module Logic = 
    let start formula = 
..... 

lub równoważny

// F# project 
module Some.Logic 
let start formula = 
..... 

i

// C# project 
..... 
Some.Logic.start(formula) 

i odniesienia F # projektu z projektu C#.

UPDATE: Jak JackP wskazał, druga alternatywa istnieje, co pozwala uniknąć korzystania z wyraźną nazw na F # boku całkowicie.

Gdy w C# utworzyć klasę poza jakimkolwiek nazw klasa ta może być określana przez poprzedzenie jej nazwę z global hasła kontekstowego następnie :: operatora, który jest drogą o przedstawieniu default top-level .NET namespace. Moduł F # z prostą nazwą spoza dowolnej przestrzeni nazw z punktu odniesienia jest równoważny temu, który ma namespace global w pierwszym wierszu kodu. Stosując tę ​​uwagę do sprawy można ewentualnie zrobić:

// F# definition 
// namespace global is assumed 
module Logic 
let start formula = 
..... 

// C# reference 
...global::Logic.start(formula)... 

gory szczegóły dotyczące global:: dostępnych na MSDN.

+6

You * * można nazwać F modułów # bez nazw z C# - wystarczy przedrostek nazwy modułu/typu z kwalifikatorem 'global ::': http://stackoverflow.com/questions/17113512/c-sharp-wpf-project- cannon-call-f-library/17113706#17113706 –

+0

@JackP: Dziękuję, Jack, za wskazanie tej alternatywnej trasy. Zaktualizuję moją odpowiedź, również ją zakrywając. –