You need to enable JavaScript to run this app. 如何在F#中实现带有params参数的C#委托?
优惠活动
大模型
产品
解决方案
定价
更多

如何在F#中实现带有params参数的C#委托?

问题原因

你此前编写的委托存在两个和C#原始定义不兼容的问题:

  • 签名结构不匹配:你定义的是接收单个元组参数的委托,而C#原始委托是两个独立的入参(string类型的方法名、object数组类型的参数列表),CLR层面的委托签名不一致,导致调用库函数失败。
  • 缺少params对应特性:C#的params关键字对应F#中的[<ParamArray>]特性,你没有给数组参数添加该特性,可变参数的调用逻辑无法兼容。

正确实现

open System

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

调用说明

添加[<ParamArray>]特性后,该委托和C#原始定义完全等价,支持两种调用方式:

  1. 零散传参(和C# params用法一致):
let impl methodName (parameters: obj[]) =
    // 此处编写委托逻辑示例
    box $"调用方法{methodName},参数个数{parameters.Length}"

let del = InvokeDelegate(impl)
// 直接传递多个零散参数,不需要手动打包数组
let result = del.Invoke("GetUser", 1001, "admin", DateTime.Now)
  1. 直接传递数组:
let paramArr = [| box 1001; box "admin"; box DateTime.Now |]
let result = del.Invoke("GetUser", paramArr)

内容的提问来源于stack exchange,提问作者Paul Biggar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 13:51:02