Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将两个值从F#返回到C#_C#_F#_Parameter Passing - Fatal编程技术网

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

如何将两个值从F#返回到C#,c#,f#,parameter-passing,C#,F#,Parameter Passing,我有一个F函数,它将字符串和数组返回给一些C代码。我尝试了一些方法,做了一些搜索,但没有结果。这是怎么做到的?我的F#函数(Gen.Best)以以下内容结尾: (T1 Best).ToString,T2 Best // return a (string) and a (float []) to C# F#显示返回类型为(单位->字符串)*float[] (T1最佳)是一个(浮动->浮动)函数 在我的C#代码中,我有: Tuple<string, double[]> Ans = Ge

我有一个F函数,它将字符串和数组返回给一些C代码。我尝试了一些方法,做了一些搜索,但没有结果。这是怎么做到的?我的F#函数(Gen.Best)以以下内容结尾:

(T1 Best).ToString,T2 Best // return a (string) and a (float []) to C#
F#显示返回类型为(单位->字符串)*float[] (T1最佳)是一个(浮动->浮动)函数

在我的C#代码中,我有:

Tuple<string, double[]> Ans = Gen.Best(XData, ResultData);
Tuple Ans=Gen.Best(扩展数据、结果数据);
编译器抱怨:

类型“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”隐式转换为“System.Tuple”
C:\Users\JDL\Dropbox\Formulas\VS-Bogdan\Quirkle\MainForm.cs 139 46 Quirkle


你的问题并不清楚你有什么问题。猜测一下:如果您只是将F#代码编译为托管DLL程序集,并从C#代码中引用它(当然,将函数公开),您会发现函数实现为返回
System.Tuple
的实例。这在C代码中运行得很好

如果这不能解决你的问题,请编辑你的问题,添加更多细节,以明确你的问题。有关如何改进问题的更多信息,请参阅


编辑:

关于您的编辑:

  • 假设丢失的引用实际上在您的C#程序集中,那么您可以像通常那样向
    FSharp.Core.dll
    程序集中添加一个引用。例如,右键单击C#项目中的“引用”项,选择“添加引用…”,确保选择了“Assemblies”,然后在列表中找到所需的程序集(您可以在搜索框中键入“FSharp.Core”,以便更轻松地找到所需的程序集)
  • 请注意,一般来说,您可能会发现仅从F#程序集中公开标准.NET类型更容易、更高效。这样,使用F库的C代码就不需要引用.NET F程序集,也不需要进行任何特殊转换(如果需要)

    在本例中,这意味着使用标准的.NET
    System.Func
    类型,而不是
    FSharpFunc
    类型

    有关我的建议的佐证,请参见相关答案。:)

  • 关于从一种元组类型转换为另一种元组类型的错误消息与您关于如何将函数转换为字符串的问题(在下面的注释中)有关。如果没有一个更清晰的问题——包括您实际打算让代码做什么,并对其进行精确的描述——我看不到回答这部分问题的方法

  • 你的问题并不清楚你有什么问题。猜测一下:如果您只是将F#代码编译为托管DLL程序集,并从C#代码中引用它(当然,将函数公开),您会发现函数实现为返回
    System.Tuple
    的实例。这在C代码中运行得很好

    如果这不能解决你的问题,请编辑你的问题,添加更多细节,以明确你的问题。有关如何改进问题的更多信息,请参阅


    编辑:

    关于您的编辑:

  • 假设丢失的引用实际上在您的C#程序集中,那么您可以像通常那样向
    FSharp.Core.dll
    程序集中添加一个引用。例如,右键单击C#项目中的“引用”项,选择“添加引用…”,确保选择了“Assemblies”,然后在列表中找到所需的程序集(您可以在搜索框中键入“FSharp.Core”,以便更轻松地找到所需的程序集)
  • 请注意,一般来说,您可能会发现仅从F#程序集中公开标准.NET类型更容易、更高效。这样,使用F库的C代码就不需要引用.NET F程序集,也不需要进行任何特殊转换(如果需要)

    在本例中,这意味着使用标准的.NET
    System.Func
    类型,而不是
    FSharpFunc
    类型

    有关我的建议的佐证,请参见相关答案。:)

  • 关于从一种元组类型转换为另一种元组类型的错误消息与您关于如何将函数转换为字符串的问题(在下面的注释中)有关。如果没有一个更清晰的问题——包括您实际打算让代码做什么,并对其进行精确的描述——我看不到回答这部分问题的方法

  • 您需要在C#项目中添加对程序集的引用,而不是在F#项目中。当然,FSharp.Core在F#项目中默认引用。本页介绍了如何:

    另一个问题是您忘记了
    ToString
    调用中的括号。这一行:

    (T1 Best).ToString,T2 Best
    
    应该是这样的:

    (T1 Best).ToString(),T2 Best
    

    您编写的代码返回一个元组,其第一个元素不是调用ToString()的结果;它是ToString方法本身,表示为类型为
    unit->string
    的F#函数。您需要在C#项目中添加对程序集的引用,而不是F#项目。当然,FSharp.Core在F#项目中默认引用。本页介绍了如何:

    另一个问题是您忘记了
    ToString
    调用中的括号。这一行:

    (T1 Best).ToString,T2 Best
    
    应该是这样的:

    (T1 Best).ToString(),T2 Best
    

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

    的F#函数,返回什么?请添加您正在使用的代码。您可以从F#项目创建类库(.dll),并调用其me