在F#中调用带可选参数的C#方法:Discord.Net适配及SDK问题
F#调用Discord.Net的AddOption方法可选参数报错问题
问题背景
我正在用F#开发Discord机器人,使用Discord.Net库。按照指南实现斜杠命令时,将C#示例转写为F#代码:
C#示例代码
var guildCommand = new Discord.SlashCommandBuilder() .WithName("list-roles") .WithDescription("Lists all roles of a user.") .AddOption("user", ApplicationCommandOptionType.User, "The users whos roles you want to be listed", isRequired: true);
转写后的F#代码在编辑器中无报错,但使用dotnet fsi运行时提示:
error FS0505: The member or object constructor 'AddOption' does not take 3 argument(s). An overload was found taking 1 arguments.
查看文档和源码可知该方法有3个必填参数,其余为带默认值的可选参数,编辑器智能提示也确认了这一点。但实验发现,只有填写所有带默认值的参数时代码才能编译,而自己编写的F#可选参数示例无需显式填写默认参数。
此外测试发现:.NET SDK 8.0.204及以下版本构建失败,8.0.300及以上版本构建成功。
解决方法
1. 升级.NET SDK版本
直接将.NET SDK升级到8.0.300或更高版本,该版本修复了F#编译器处理C#可选参数的兼容性问题,升级后即可正常调用AddOption方法,无需填写所有可选参数。
2. 临时兼容方案(无法升级SDK时)
如果暂时无法升级SDK,可以通过显式指定命名参数的方式调用,确保F#编译器能正确识别重载:
let guildCommand = Discord.SlashCommandBuilder() .WithName("list-roles") .WithDescription("Lists all roles of a user.") .AddOption( name = "user", optionType = ApplicationCommandOptionType.User, description = "The users whos roles you want to be listed", isRequired = true )
问题根源
这个问题的本质是旧版本.NET SDK中F#编译器对C#可选参数的解析存在兼容性bug:
- C#的可选参数通过
[Optional]特性和默认值实现,但旧版本F#编译器无法正确识别带有多个必填参数+可选参数的C#方法重载,误判为仅存在1个参数的重载。 - .NET SDK 8.0.300及以上版本中,F#编译器修复了该解析问题,能够正确识别C#方法的必填参数与可选参数结构,因此可以正常调用。
内容的提问来源于stack exchange,提问作者Arnav Borborah
相关产品推荐
相关产品推荐

