F# - 使用带有 out 参数的 C# 方法(在数组和 void return 中)

F# - Use C# methods with out parameter (within arrays and void return)

我已经读过 但我仍然不能让它适用于我的情况(最简单的 solution/syntax)。

我在 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 相比,我看到 2 个不同之处:

编译器接受这种语法:

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# 可以将它们用作 returned 元组。

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

如果您想在 F# 中使用 out 参数,您可以使用 &var 语法传递对局部可变变量的引用,或者您可以指定 [=] 类型的引用单元格13=] 作为参数。下面显示了使用标准 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