繁体   English   中英

如何将值设置为 Null 作为可选参数的 C# 任务?

[英]How do I make a C# Task with values set to Null as Optional Parameters?

我正在研究 Discord Bot,其中一个命令是选择 1 到 4 之间的随机数,称为 D4。

它本身工作正常,但我想允许修改器,用户提供输入,然后机器人将在将所有内容加在一起后产生结果。

问题是我想允许最多 5 个单独的数字,但不要求它们才能正确执行 function 的任务/命令。

我试过让它们可以为空,使用int? 并将它们设置为null ,但我收到一条错误消息,指出可空对象必须具有值。 如果它们不可为空,则错误是如果用户没有输入足够的修饰符值,则输入的参数太少。

这是它目前的样子 -

public async Task D4(int? modifier1 = 4, int? modifier2 = null, int? modifier3 = null ,
        int? modifier4 = null, int? modifier5 = null)
    {

        int modifiers = (int)(modifier1 + modifier2 + modifier3 + modifier4 + modifier5);
        int randNum = Rnumber.Next(1, 4);

        int sum = randNum + modifiers;

        await Context.Channel.SendMessageAsync(Context.User.Mention + " rolled " + randNum.ToString()
            + " With Modifier the total is: " + sum.ToString());
    }

我不确定我需要做什么来解决这个问题。 有机会我可能会离开。

我得到的错误是“输入文本的参数太少”。 和“可为空的 object 必须有一个值。”

如果您希望忽略修饰符,如果未输入,请尝试将 0 作为默认值。 这样,您就不需要可为空的整数。 此外,没有提供值的修饰符不会修改总和:

public async Task D4(int modifier1 = 4, int modifier2 = 0, int modifier3 = 0,
        int modifier4 = 0, int modifier5 = 0)
    {

        int modifiers = modifier1 + modifier2 + modifier3 + modifier4 + modifier5;
        int randNum = Rnumber.Next(1, 4);

        int sum = randNum + modifiers;

        await Context.Channel.SendMessageAsync(Context.User.Mention + " rolled " + randNum.ToString()
            + " With Modifier the total is: " + sum.ToString());
    }

问题出在这条线上:

int modifiers = (int)(modifier1 + modifier2 + modifier3 + modifier4 + modifier5);

这是警告您,因为如果其中一个是null ,它将无法将数字相加。

当 arguments 为null时,您可以将该行更改为如下内容:

int modifiers = modifier1 ?? 0 
                + modifier2 ?? 0 
                + modifier3 ?? 0 
                + modifier4 ?? 0 
                + modifier5 ?? 0;

这将允许您将 null 传递给D4() ,这比传递 0 更好,因为 0 就像一个幻数,而传递 null 感觉更像是没有传递任何值。


关于:

问题是我想允许最多 5 个单独的数字,但不要求它们才能正确执行 function 的任务/命令。

就像 Alexei 在评论中建议的那样,您也可以将签名更改为:

public async Task D4(params int[] modifiers)
{
    // TODO: Handle the case where too many "modifiers" are passed
    int sum = modifiers.Sum();
    // ...
}

它可以称为:

await D4(1);
await D4(1, 2);
// etc.

这种方法的唯一缺点是您不能在编译时限制“修饰符”的数量。

对于这种特殊情况,我仍然坚持前面的示例,它允许 null 值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM