System.CommandLine Argument类使用疑问:为何无法传递参数值?
对System.CommandLine中Argument类的误解分析
你在使用System.CommandLine的Argument类时,核心误解混淆了**Argument(位置参数)与Option(命名选项)**的本质区别:
核心区别说明
- Argument是位置参数:不需要
--/-这类前缀标识,命令行中直接按顺序传递对应值,它的name参数只是代码里的逻辑标识,不是命令行里的调用前缀。 - Option是命名选项:必须通过
--/-前缀来指定,然后跟随对应的值,这也是你替换成Option后程序正常运行的原因。
错误原因
你给Argument的name设为--input是错误用法,当你用--input "Hello World"调用程序时,System.CommandLine会将--input识别为未知的命令/参数,同时Hello World也无法匹配到正确的位置参数,因此抛出Unrecognized command or argument 'Hello World'.错误。
正确使用Argument的示例代码
using System.CommandLine; // Argument的name为逻辑名称,无需带--前缀 var inputArgument = new Argument<string>( name: "input", description: "input any value and print it out"); var rootCommand = new RootCommand(); rootCommand.AddArgument(inputArgument); rootCommand.SetHandler((inputArgumentValue) => { Console.WriteLine($"{inputArgumentValue}"); }, inputArgument); rootCommand.Invoke(args);
正确调用方式
直接传递值即可,不需要前缀:
your-app-name "Hello World"
如果必须使用--input这类带前缀的调用形式,只能选择Option类;若要保留Argument的特性,就必须遵循位置参数的使用规则,直接按顺序传递值。
内容的提问来源于stack exchange,提问作者hyt
相关产品推荐
相关产品推荐

