如何从 F# 返回两个值到 C#

问题描述 投票:0回答:2

我有一个 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# parameter-passing
2个回答
3
投票

您需要在 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# 函数。


2
投票

如果您只是将 F# 代码编译为托管 DLL 程序集并从 C# 代码中引用它(当然,使您的函数公开),您会发现您的函数实现为返回

System.Tuple<string, float[]>
的实例。这对于 C# 代码来说效果很好。

编辑:

关于您的编辑:

  1. 假设缺少的引用实际上位于您的 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>
类型。

请参阅相关答案中的此评论以证实我的建议。 :)

  1. 有关从一种元组类型转换为另一种元组类型的错误消息与您关于如何将函数转换为字符串的问题(在下面的评论中)相关。
© www.soinside.com 2019 - 2024. All rights reserved.