c# - 如何将值设置为 Null 作为可选参数的 C# 任务?
问题描述
我正在开发一个 Discord Bot,其中一个命令是选择一个介于 1 和 4 之间的随机数,称为 D4。
它本身工作正常,但我想允许修改器,用户提供输入,然后机器人将在将所有内容加在一起后产生结果。
问题是我希望最多允许 5 个单独的数字,但不需要它们以使任务/命令正常运行。
我已经尝试使它们可以为空,使用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());
}
我不确定我需要做什么来解决这个问题。有机会我可能会离开。
我得到的错误是“输入文本的参数太少”。和“可为空的对象必须有一个值。”
解决方案
问题出在这条线上:
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 感觉更像是没有传递任何值。
关于:
问题是我希望最多允许 5 个单独的数字,但不需要它们以使任务/命令正常运行。
就像 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.
这种方法的唯一缺点是您不能在编译时限制“修饰符”的数量。
对于这种特殊情况,我仍然会坚持前面允许空值的示例。
推荐阅读
- typescript - TS rxjs-compat 不支持原型运算符?
- spring - 当依赖项也有 application.yml 文件时,带有 application.yml 的 Spring Boot 应用程序如何表现
- python - 将区域分配给字典中的状态时如何修复 KeyError
- python - Python 可执行文件不运行:找不到命令
- java - Hibernate GenerationType.Table
- c# - C# - 无法在第二台计算机上接收 UDP
- mysql - 在 db 中查找对象并从 ActiveRecord 中的另一个表中附加一个额外的参数
- android - 如果有很多条目,为什么要在渲染慢速/冻结应用程序中使用地图?
- jquery - 一段时间后如何隐藏帖子?
- python - 根据熊猫数据框中的字符串搜索将值分配给列表?