我有一个 F# 函数,将字符串和数组返回给某些 C# 代码。我尝试了一些方法并进行了一些搜索,但没有成功。这是怎么做到的?我的 F# 函数 (Gen.Best) 结尾为:
(T1 Best).ToString,T2 Best // return a (string) and a (float []) to C#
F# 将返回类型显示为 (unit -> String) * float [] (T1 Best) 是一个 (float -> float) 函数。
在我的 C# 代码中:
Tuple<string, double[]> Ans = Gen.Best(XData, ResultData);
编译器抱怨:
类型“Microsoft.FSharp.Core.Unit”在未引用的程序集中定义。您必须添加对程序集“FSharp.Core,Version=4.3.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。
C:\Users\JDL\Dropbox\Formulas\VS Bogdan\Quirkle\MainForm.cs 139 13 Quirkle
如何添加对程序集的引用? (我是 F# 新手)
和
无法将类型 'System.Tuple
,double[]>' 隐式转换为 'System.Tuple '
C:\Users\JDL\Dropbox\Formulas\VS Bogdan\Quirkle\MainForm.cs 139 46 Quirkle
您需要在 C# 项目(而不是 F# 项目)中添加对程序集的引用。当然,F# 项目中默认引用 FSharp.Core。本页介绍了操作方法:https://msdn.microsoft.com/en-us/library/7314433t%28v=vs.90%29.aspx
另一个问题是您忘记了
ToString
调用中的括号。这一行:
(T1 Best).ToString,T2 Best
应该是这样的:
(T1 Best).ToString(),T2 Best
您编写的代码返回一个元组,其第一个元素不是调用 ToString() 的结果;它是 ToString 方法本身,表示为
unit -> string
类型的 F# 函数。
如果您只是将 F# 代码编译为托管 DLL 程序集并从 C# 代码中引用它(当然,使您的函数公开),您会发现您的函数实现为返回
System.Tuple<string, float[]>
的实例。这对于 C# 代码来说效果很好。
编辑:
关于您的编辑:
FSharp.Core.dll
程序集的引用。例如。右键单击 C# 项目中的“References”项,选择“Add Reference...”,确保选择“Assemblies”,然后在列表中找到所需的程序集(您可以在“FSharp.Core”中键入“FSharp.Core”)搜索框可以更轻松地找到所需的组件)。请注意,一般来说,您可能会发现仅从 F# 程序集中公开标准 .NET 类型更容易、更高效。这样,使用 F# 库的 C# 代码不需要引用 .NET F# 程序集,也不需要执行任何特殊转换(如果需要)。
在这种情况下,这意味着使用标准 .NET
System.Func<1, TResult>
类型而不是 FSharpFunc<'T, 'U>
类型。
请参阅相关答案中的此评论以证实我的建议。 :)