如何 return 从 F# 到 C# 的两个值

How to return two values from F# to C#

我有一个 F# 函数 return 将字符串和数组转换为一些 C# 代码。我尝试了几种方法并进行了一些搜索但无济于事。这是怎么做到的?我的 F# 函数 (Gen.Best) 以:

结尾
(T1 Best).ToString,T2 Best // return a (string) and a (float []) to C#

F# 将 return 类型显示为 (unit -> String) * float [] (T1 Best) 是一个 (float -> float) 函数。

在我的 C# 代码中我有:

Tuple<string, double[]> Ans = Gen.Best(XData, ResultData);

编译器抱怨:

The type 'Microsoft.FSharp.Core.Unit' is defined in an assembly that is not referenced. You must add a reference to assembly '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# 新手)

Cannot implicitly convert type 'System.Tuple<Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,string>,double[]>' to 'System.Tuple<string,double[]>'
C:\Users\JDL\Dropbox\Formulas\VS Bogdan\Quirkle\MainForm.cs 139 46 Quirkle

从你的问题中并不清楚你遇到了什么问题。猜测一下:如果您只是将 F# 代码编译为托管 DLL 程序集并从 C# 代码中引用它(当然,使您的函数 public),您会发现您的函数实现为返回 System.Tuple<string, float[]>。这适用于 C# 代码。

如果这不能解决您的问题,请使用更多详细信息编辑您的问题,以准确阐明您 的问题。请参阅 https://whosebug.com/help/how-to-ask 了解有关如何改进您的问题的更多信息。


编辑:

关于您的编辑:

  1. 假设缺少的引用实际上在您的 C# 程序集中,那么您可以按照通常的方式添加对 FSharp.Core.dll 程序集的引用。例如。右键单击 C# 项目中的 "References" 项,选择 "Add Reference...",确保选择 "Assemblies",然后在列表中找到所需的程序集(您可以键入 "FSharp.Core"在搜索框中,以便更容易找到所需的程序集)。

请注意,通常情况下,您可能会发现仅从 F# 程序集中公开标准 .NET 类型会更容易、效率更高。这样,使用 F# 库的 C# 代码就不需要引用 .NET F# 程序集,也不需要做任何特殊的转换(如果需要)。

在这种情况下,这意味着使用标准 .NET System.Func<1, TResult> 类型而不是 FSharpFunc<'T, 'U> 类型。

请参阅相关答案中的 this comment 以证实我的建议。 :)

  1. 有关从一种元组类型转换为另一种元组类型的错误消息与您关于如何将函数转换为字符串的问题(在下面的评论中)有关。如果没有更明确的问题——包括 a good, minimal, complete code example 和对代码实际打算做什么的精确描述——我看不出有什么方法可以回答这部分问题。

您需要在 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

您编写的代码 returns 一个元组,其第一个元素不是调用 ToString() 的结果;它是 ToString 方法本身,表示为 unit -> string.

类型的 F# 函数