我想将几个数字传递给 C# 控制台应用程序,并准备了一个 .Net Fiddle 来演示我的问题:
private const long DEFAULT_ALPHA_VALUE = 1234567890L;
private static long[] alphas = { DEFAULT_ALPHA_VALUE };
public static async Task Main()
{
Option<long[]> alphaOption = new
(
aliases: new[] { "-a", "--alpha" },
getDefaultValue: () => new[] { DEFAULT_ALPHA_VALUE },
description: "Numerical alpha values"
);
RootCommand rootCommand = new("A test app for multiple numerical values option");
rootCommand.AddGlobalOption(alphaOption);
rootCommand.SetHandler(a => { alphas = a; }, alphaOption);
await RunInvokeAsync(rootCommand, "-a", "1234");
await RunInvokeAsync(rootCommand, "-a", "1234", "5678"); // Unrecognized command or argument '5678'.
await RunInvokeAsync(rootCommand, "-a", "1234 5678"); // Cannot parse argument '1234 5678' for option '-a' as expected type 'System.Int64'.
await RunInvokeAsync(rootCommand, "-a", "1234,5678"); // Cannot parse argument '1234 5678' for option '-a' as expected type 'System.Int64'.
}
private static async Task RunInvokeAsync(RootCommand rootCommand, params string[] args)
{
int status = await rootCommand.InvokeAsync(args);
Console.WriteLine($"args: {JsonSerializer.Serialize(args)}, status: {status}, alphas: {JsonSerializer.Serialize(alphas)}");
}
我希望能够通过在 CLI 上运行以下命令之一来传递多个数字:
dotnet run --project MyTestProject.csproj --a 1234 5678
dotnet run --project MyTestProject.csproj --a 1234,5678
但是正如您在屏幕截图中看到的,存在运行时错误:
我的问题是:如何传递多个数字,我是否在 C# 代码中错误地选择了它们,或者我是否以错误的方式调用了 C# 应用程序?
试试这个
Option<long[]> alphaOption = new
(
aliases: new[] { "-a", "--alpha" },
getDefaultValue: () => new[] { DEFAULT_ALPHA_VALUE },
description: "Numerical alpha values"
){AllowMultipleArgumentsPerToken = true};
兴趣点是最后一行。
在这种情况下,将正确处理以下值
await RunInvokeAsync(rootCommand, "-a", "1234");
await RunInvokeAsync(rootCommand, "-a", "1234", "5678");
后两者仍然会失败,但这是预期的,因为您尝试使用“1234 5678”或“1234,5678”作为single参数,这显然是错误的并且无法解析为数字。要从命令行模拟此类情况,用户应使用额外的转义来明确告诉解释器将输入视为单个参数,因此对于开发人员来说这不应该成为问题。