gpt4 book ai didi

c# - F# 编译器如何知道正在调用 C# 方法以及参数需要语法元组?

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:28 24 4
gpt4 key购买 nike

引用F# - On the parameters passed to C# methods - are they tuples or what? ,当从 F# 调用 C# 方法时,参数作为语法元组提供。

我的理解是 C# 方法必须以这种方式调用。因此,以该问题为例,

MyClsas.Add(4, 5) |> printfn "%d"

工作正常,而

MyClsas.Add 4 5 |> printfn "%d"

会报错

This value is not a function and cannot be applied
This expression was expected to have type
int * int
but here has type
int

因此,我的问题是,F# 如何知道正在调用的是 C# 方法并且需要语法元组?

最佳答案

我的 F# 扩展程序集元数据以支持功能概念。考虑一下:

module MyModule =
let curried x y z = x*y + z
let tupled (x,y,z) = x*y + z

MyModule 反编译:

[CompilationArgumentCounts(new int[]
{
1,
1,
1
})]
public static int curried(int x, int y, int z)
{
return x * y + z;
}


public static int tupled(int x, int y, int z)
{
return x * y + z;
}

因此 F# 似乎以属性的形式添加了额外的元数据,以帮助 F# 编译器认识到 curried 不同于 tupled。但是用 CompiliationArgumentCounts 扩展你的 C# 方法是行不通的(我试过了)。 F# 似乎以两种程序集资源的形式添加了更多元数据,分别称为 FSharpSignatureData.CurryFSharpOptimizationData.Curry

C# 不知道此元数据,因此 curriedtupled 的签名在 C# 中是相同的。

如果您是好奇心强的人,请给个小费;下载一个很好的 .NET 反编译器(有很多)。通过反编译为 IL 或 C#,您通常可以了解很多关于语言功能的实际实现方式以及它们带来的隐藏成本。

关于c# - F# 编译器如何知道正在调用 C# 方法以及参数需要语法元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com