【问题标题】:F# - Use C# methods with out parameter (within arrays and void return)F# - 使用带有 out 参数的 C# 方法(在数组内和 void 返回)
【发布时间】:2020-11-14 13:07:15
【问题描述】:

我已阅读 the-f-equivalent-of-cs-out,但我仍然无法使其适用于我的情况(最简单的解决方案/语法)。

我在一个 C# 项目中有这个方法:

//<Project Sdk="Microsoft.NET.Sdk">
//<TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks>

public static void ABC(out byte[] a, out byte[] b, byte[] c)
{
    var aaa = new byte[10];
    var bbb = new byte[10];            
    a = aaa;
    b = bbb;
}

现在,我想在 F# 项目中使用它: 我正在使用 FSharp.Core 4.7.2

(* <Project Sdk="Microsoft.NET.Sdk">
   <TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks> *)

let a,b = ABC(c)

我在模仿TryParse 的语法,编译时没有错误:

let success, number = System.Int32.TryParse("0")

我的 ABC(c) 调用中的编译器抱怨签名要求 3 个参数,而不是 1 个这一事实。
TryParse 相比,我发现了两个不同之处:

  • 不返回void
  • 它使用数组对象

编译器接受以下语法:

let a = Array.empty<byte>
let b = Array.empty<byte>
ABC(ref a, ref b, c) 

但是:

  1. 我觉得这里用ref是不正确的,不能这样用(因为ab是不可变的)
  2. 我想使用类似于TryParse 的简洁语法,我想知道为什么它在这里不起作用

我可以更改 C# 项目代码,但替换该项目中的所有 out 参数将是第二步,如果我有困难或疑问,可能是一个新问题。

[更新:参数位置]

我玩了一点,似乎我发现“简单”语法(不传递 ref 参数)被破坏了。

public static void TryParseArray(string input, out int[] result) {
    result = new int[0];
}

public static void TryParseArray_2(out int[] result, string input) {
    result = new int[0];
}
let arr = csharp.TryParseArray("a")            // OK
let arr = csharp.TryParseArray_2("a")          // ERROR

似乎 out 参数必须在 C# 方法中的末尾(= 后面不跟普通参数),以使 F# 可以将它们用作返回的元组。

【问题讨论】:

  • 您可以使用ref 单元格语法,但不是这样,而是将ab 变量定义为ref Array.empty&lt;byte&gt;,然后将其作为参数传递(没有ref 关键字)。您也可以将它们设为mutable 并传入地址。

标签: f# out c#-to-f#


【解决方案1】:

您正确地注意到,将参数转换为返回元组的“简化”F# 语法仅适用于非常有限的情况 - 仅当您有一个参数并且它是最后一个参数时。换句话说,这个特性有助于一些常见的模式,但它并不能完全替代 out 参数。

如果您想在 F# 中使用 out 参数,您可以使用 &amp;var 语法传递对局部可变变量的引用,或者您可以指定 int ref 类型的引用单元格作为参数。下面显示了使用标准TryParse 方法的两个选项:

// Using a local mutable variable
let mutable n = 0
Int32.TryParse("42", &n)
printfn "Got: %d" n

// Using a reference cell initialized to 0 
let n = ref 0
Int32.TryParse("42", n)
printfn "Got: %d" n.Value

【讨论】:

    猜你喜欢
    • 2012-07-10
    • 2017-07-13
    • 2013-04-18
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多