Func <SocketMessage, Task> не принимает 2 аргумента, но документация говорит иначе? - PullRequest
0 голосов
/ 15 января 2019

Я использую Discord.Net 1.0.2v, потому что большинство учебных пособий и доступной документации относятся к 1.0.2. По сути, я пытаюсь получить сообщение, скачать его, удалить его с помощью discord.net. Похоже, что я все сделал правильно, я указал _client как DiscordSocketClient, я установил все как положено, я попытался сделать его функцией, а не асинхронной, но это должно быть так Я могу сделать это по команде. Я также пытался создать его с нуля, но было больше ошибок, чем я мог сосчитать, поэтому вот мой код.

    private DiscordSocketClient _client;
    [Command("NBDelete")]
    [RequireBotPermission(Discord.GuildPermission.ManageMessages)]
    [RequireUserPermission(Discord.GuildPermission.ManageMessages)]
    public async Task DeleteNonBotMessages()
    {

        _client = new DiscordSocketClient();
        // error starts here
        _client.MessageReceived += async (s, e) =>
        {
            var channel = e.Server.FindChannels("general", ChannelType.Text).FirstOrDefault();
            var user = _client.CurrentUser;
            spamold = spamnew;
            Message[] messagesToObtain;
            messagesToObtain = await e.Channel.DownloadMessages(1);
            spamnew = string.Format(messagesToObtain);
            if (spamnew == spamold)
            {
                Message[] messagesToDelete;
                messagesToDelete = await e.Channel.DownloadMessages(2);
                await e.Channel.DeleteMessages(messagesToDelete);
            };

        };
    }

Я ожидаю, что программа сможет получать сообщения, загружать их, а затем разрешать удалять их. Полная ошибка: "Delegate'Func<SocketMessage, Task> 'не принимает 2 аргумента"

1 Ответ

0 голосов
/ 15 января 2019

Полная декларация Func<T, TResult> равна

public delegate TResult Func<in T,out TResult>(T arg);

, который является делегатом (функция, которая может быть назначена переменной), который имеет параметр T и возвращаемое значение TResult.

Следовательно, Func<T, TResult> имеет два параметра типа , но функция имеет один аргумент и возвращаемое значение. Объект типа Func<SocketMessage, Task> является делегатом, который принимает SocketMessage и возвращает Task. Следовательно, подпись вашего лямбда-метода будет выглядеть следующим образом:

_client.MessageReceived += async (socketMessage) =>
{
    // ... do your stuff here
};

Обратите внимание , что SocketMessage не имеет свойства Server. Что-то в твоей лямбде не правильно, за неправильной подписью.

...