Func‹SocketMessage, Task› не принимает 2 аргумента, но документация говорит об обратном?

Я использую 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 аргумента.


person Billys Tutorial    schedule 15.01.2019    source источник
comment
Когда у вас есть Func<T, TResult>, то один является аргументом, а другой — возвратом.   -  person Brian Rasmussen    schedule 15.01.2019
comment
Func<SocketMessage, Task> принимает только один аргумент, и вы нигде не используете аргумент s. Попробуйте удалить это.   -  person Sweeper    schedule 15.01.2019
comment
Вы используете методы, существующие только в 0.9, что совершенно несовместимо с 1.0 и выше. Кроме того, 2.0 — это последняя версия, которую вы должны использовать.   -  person Still    schedule 15.01.2019
comment
Кроме того, последняя документация Discord.Net находится на discord.foxbot.me/latest или docs.stillu.cc — откуда бы вы ни взяли документацию или фрагмент, к сожалению, она сильно устарела.   -  person Still    schedule 15.01.2019


Ответы (1)


Полное объявление 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. Что-то в вашей лямбде не так, кроме неправильной подписи.

person Paul Kertscher    schedule 15.01.2019