【发布时间】: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)
但是:
- 我觉得这里用
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# 可以将它们用作返回的元组。
【问题讨论】:
-
您可以使用
ref单元格语法,但不是这样,而是将a和b变量定义为ref Array.empty<byte>,然后将其作为参数传递(没有ref 关键字)。您也可以将它们设为mutable并传入地址。