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

本文关键字:两个 何返回 返回 | 更新日期: 2024-09-08 06:14:41

我有一个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<Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,string>,double[]>'to'System.Tuple<字符串,双[]>'
C: ''Users''JDL''Dropbox''Formulas''VS Bogdan''Quirkle''MainForm.cs 139 46 Quirkle

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

您需要在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#代码配合使用很好。

如果这不能解决你的问题,请编辑你的问题并添加更多细节,以明确你问的是什么。请参阅https://stackoverflow.com/help/how-to-ask了解有关如何改进问题的更多信息。


编辑:

关于您的编辑:

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

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

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

请参阅相关答复中的这一评论,以证实我的建议。:)

  1. 关于从一种元组类型转换为另一种元组的错误消息与您关于如何将函数转换为字符串的问题(在下面的注释中)有关。没有更清楚的问题–包括一个良好的最小完整的代码示例,以及对代码实际意图的精确描述–我看不出有什么办法回答这部分问题