【问题标题】:How do I write a delegate with params in F#?如何在 F# 中编写带参数的委托?
【发布时间】:2021-07-07 20:00:19
【问题描述】:

我有一个需要在 F# 中复制的 C# 委托:

  public delegate object InvokeDelegate(string method, params object[] parameters)

如何在 F# 中复制它?

我试过了:

type InvokeDelegate = delegate of (string * (obj [])) -> obj

我不确定这有什么特别之处,只是如果我使用我尝试过的 F# 委托,在某些库函数上调用委托不起作用。

我认为它可能是 params 关键字,但我不知道如何在 F# 中做到这一点。

【问题讨论】:

  • 尝试删除一个或两个括号。试试delegate of string -> obj[] -> obj,这可能看起来不合逻辑,但可能会奏效。

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


【解决方案1】:

这有点乱,因为 F# 没有 params 语法糖,但您可以这样做:

open System

type InvokeDelegate = delegate of method: string * [<ParamArray>] parameters: obj [] -> obj

这将compile down into the following C# equivalent delegate:

[Serializable]
[CompilationMapping(SourceConstructFlags.ObjectType)]
public delegate object InvokeDelegate(string method, params object[] parameters);

参数数组见这里:https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/parameters-and-arguments#parameter-arrays

这里是代表:https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/delegates

请注意,您的定义也是一个元组定义(括号就是这样做的),编译成一个以简单元组作为参数的委托。这可能是 F# 中比较古怪的地方之一。

【讨论】:

  • 我不明白使用星号 (*) 背后的逻辑,只有当它是元组参数时没有括号,而不是箭头。我每次都偶然发现这个,必须查一下。只是……不合逻辑吗?
  • 我也没有,但考虑到它是 (1) 从 pre-F# 1.0 天开始的,并且 (2) F# 语言设计力求保持一致,我猜是在实现它时存在某种问题允许-&gt;,现在由于向后兼容,我们被困住了。也许更新文档以澄清这是否值得?
  • 可能和这个合法的语法不冲突有关,用于返回函数:type MyDelegate = delegate of int -&gt; (string -&gt; bool -&gt; float)
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多