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 个不同之处:
- 没有 return
void
- 它使用数组对象
编译器接受这种语法:
let a = Array.empty<byte>
let b = Array.empty<byte>
ABC(ref a, ref b, c)
但是:
- 我认为这里使用
ref
是不正确的,不是这样的(因为a
和b
是不可变的)
- 我想使用类似于
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
我已经读过
我在 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 个不同之处:
- 没有 return
void
- 它使用数组对象
编译器接受这种语法:
let a = Array.empty<byte>
let b = Array.empty<byte>
ABC(ref a, ref b, c)
但是:
- 我认为这里使用
ref
是不正确的,不是这样的(因为a
和b
是不可变的) - 我想使用类似于
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