从C#调用一个F#函数

8
我是一个可以翻译文本的助手。
我看了其他的说明,仍然不知道怎样做。我有两个项目(C#计算器和F#逻辑)。我在计算器中添加了对逻辑的引用,并且添加了对 FSharp.Core 的引用。
但是当我添加下面这行代码:
float result = Logic.start(formula);

在我的C#项目中,我收到了一个错误信息,内容为:
"The name Logic does not exist in the current context."
逻辑项目中有一个名为Logic的模块,所以它应该会出现在当前上下文中,但是为什么还是出错了?
编辑:以下是函数定义...
let start formula =
core (List.ofSeq formula) [] []

你需要确保类型和方法都是公共的。我不记得 F# 中是哪个部分实现这一点了。也许可以贴出定义? - Darren Kopp
请从C#调用F#代码 - Mayank
1个回答

20

你无法仅使用 F# 模块的方式在 C# 中引用,因为它没有命名空间。请尝试以下操作:

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

或同等

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

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

并从C#项目引用 F# 项目。

更新:正如JackP所指出的,另一种选择存在,可以完全避免在 F# 端使用显式命名空间。

当你在 C# 中创建一个位于任何命名空间之外的类时,可以通过在该类名称前加上 global 上下文关键字和后面的 :: 运算符来引用该类,这是引用 默认顶层 .NET 命名空间 的方式。在任何命名空间之外具有简单名称的 F# 模块从引用的角度来看相当于第一行代码中有namespace global的模块。将此考虑应用于您的情况,您可以选择执行以下操作:

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

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

关于global::的血腥细节可在MSDN上找到。


7
您可以在C#中通过前缀 global:: 来调用没有命名空间的F#模块/类型:https://dev59.com/qHPYa4cB1Zd3GeqPhlQe#17113706。请注意,这并不会改变原有的意思。 - Jack P.
1
@JackP:感谢你指出这个替代方案,我会更新我的答案并加以涵盖。 - Gene Belitski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接