我看过其他说明,但仍然不知道如何做到这一点。我有两个项目(C#中的Calculator和F#中的Logic)。我在计算器中添加了对Logic的引用,以及对FSharp.Core的引用
但是当我添加行
时float result = Logic.start(formula);
在我的C#项目中,我收到错误消息:
“逻辑在当前上下文中不存在。”
逻辑项目中有一个模块逻辑,所以它应该显示正确吗?我还缺少什么?
编辑:这是功能定义......
let start formula =
core (List.ofSeq formula) [] []
答案 0 :(得分:19)
你不能从C#中引用一个没有任何名称空间的F#模块。做这样的事情:
// 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
上下文关键字后跟::
运算符前面添加其名称来引用该类,这是引用{{3}的方式}。从参考角度看,在任何命名空间之外具有简单名称的F#模块等同于在第一行代码中具有default top-level .NET namespace的模块。将此考虑因素应用于您的案例,您可以选择:
// F# definition
// namespace global is assumed
module Logic
let start formula =
.....
// C# reference
...global::Logic.start(formula)...
namespace global
上global::
提供有关{{1}}的详细信息。