如何创建 C# 任务并将值设置为 Null 作为可选参数?
How do I make a C# Task with values set to Null as Optional Parameters?
我正在开发 Discord Bot,其中一个命令是在 1 到 4 之间选择一个随机数,称为 D4。
它本身工作正常,但我想允许修饰符,用户提供输入,然后机器人将在将所有内容加在一起后产生结果。
问题是我想允许最多 5 个单独的号码,但为了 Task/Command 正常运行不需要它们。
我尝试使用 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());
}
我不确定我需要做什么来解决这个问题。有可能我跑路了。
我得到的错误是“输入文本的参数太少”。和
“可为 Null 的对象必须有一个值。”
如果您希望修饰符被忽略,如果没有输入,请尝试将 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
。
,它就无法将数字相加
您可以将该行更改为类似以下内容以处理参数为 null
:
的情况
int modifiers = modifier1 ?? 0
+ modifier2 ?? 0
+ modifier3 ?? 0
+ modifier4 ?? 0
+ modifier5 ?? 0;
这将允许您将 null 传递给 D4()
,这比传递 0 更好,因为 0 就像一个神奇的数字,而传递 null 感觉更像是没有传递任何值。
关于:
The issue is that I want to allow for up to 5 separate numbers, but not have them be required in order for the Task/Command to function properly.
就像 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.
这种方法的唯一缺点是您不能在编译时限制“修饰符”的数量。
对于这种特殊情况,我仍然坚持前面允许空值的示例。
我正在开发 Discord Bot,其中一个命令是在 1 到 4 之间选择一个随机数,称为 D4。
它本身工作正常,但我想允许修饰符,用户提供输入,然后机器人将在将所有内容加在一起后产生结果。
问题是我想允许最多 5 个单独的号码,但为了 Task/Command 正常运行不需要它们。
我尝试使用 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());
}
我不确定我需要做什么来解决这个问题。有可能我跑路了。
我得到的错误是“输入文本的参数太少”。和 “可为 Null 的对象必须有一个值。”
如果您希望修饰符被忽略,如果没有输入,请尝试将 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
。
您可以将该行更改为类似以下内容以处理参数为 null
:
int modifiers = modifier1 ?? 0
+ modifier2 ?? 0
+ modifier3 ?? 0
+ modifier4 ?? 0
+ modifier5 ?? 0;
这将允许您将 null 传递给 D4()
,这比传递 0 更好,因为 0 就像一个神奇的数字,而传递 null 感觉更像是没有传递任何值。
关于:
The issue is that I want to allow for up to 5 separate numbers, but not have them be required in order for the Task/Command to function properly.
就像 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.
这种方法的唯一缺点是您不能在编译时限制“修饰符”的数量。
对于这种特殊情况,我仍然坚持前面允许空值的示例。