簡體   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