Доступ к члену 'object.equals(object?, object?') невозможен с помощью ссылки на экземпляр; уточните его с помощью имени вместо строки в удалении списка c#?

У меня есть список жанров, и я пытаюсь удалить жанр, который пользователь добавит в него, независимо от случая. Я указал строковую переменную с именем «жанр» выше в коде, но получаю CS0176, когда пытаюсь выполнить команду RemoveAll(). Вот кусок кода, который играет:

        [Command("RemoveGenre")]
        [Description("Remove a genre from the list of genres")]
        public async Task Remove(CommandContext ctx, string genre)
        {
            if (genres.Contains(genre, StringComparer.OrdinalIgnoreCase))
            {
                var message = await ctx.RespondAsync($"Are you sure " + genre + " is correct?");

                var yes = DiscordEmoji.FromName(ctx.Client, ":white_check_mark:");
                var no = DiscordEmoji.FromName(ctx.Client, ":x:");

                await message.CreateReactionAsync(yes);
                await message.CreateReactionAsync(no);

                var interactivity = ctx.Client.GetInteractivity();

                var reactionResult = await interactivity.WaitForReactionAsync(x => x.Message == message, ctx.User, TimeSpan.FromSeconds(30)).ConfigureAwait(false);

                while (!reactionResult.TimedOut)
                {
                    if (reactionResult.Result.Emoji == yes)
                    {
                        genres.RemoveAll(n => n.Equals(genre, StringComparer.OrdinalIgnoreCase));
                        await ctx.Channel.SendMessageAsync("Removed " + genre + " from list. Genre list now contains " + genres.Count.ToString() + " genres").ConfigureAwait(false);
                        break;
                    }
                    else if (reactionResult.Result.Emoji == no)
                    {
                        await Cancel(ctx);
                        break;
                    }
                    else
                    {
                        await ctx.Channel.SendMessageAsync($"Please use the emojis provided. Cancelled.");
                        break;
                    }
                }
            }
            else
            {
                await ctx.Channel.SendMessageAsync("This genre doesn't exist in the list! Nothing has been removed.").ConfigureAwait(false);
            }
        }

Бит, в котором есть ошибка, - это часть «n.Equals», и я не уверен, почему. Кроме того, жанры списка строк.

Если бы кто-нибудь мог мне помочь, это было бы очень хорошо. Заранее спасибо!

Каково определение «жанра»? Может он статический?

Saber 20.12.2020 14:37

Это не статично, это одна из переменных, которые я настроил в асинхронной задаче. «Удалить общедоступную асинхронную задачу (CommandContext ctx, строковый жанр)».

Komsur 20.12.2020 14:40

@Komsur: Вот почему полезно показать минимальный воспроизводимый пример - поэтому нам не нужно угадывать такие вещи ... Точно так же мы не знаем тип genres.

Jon Skeet 20.12.2020 14:46

Это список строк.

Komsur 20.12.2020 14:49

@Komsur: Но опять же, если бы вы показали это на минимальном воспроизводимом примере , нам бы не пришлось спрашивать. То, что у вас есть сейчас, лучше (в том смысле, что это показывает genre), но оно все еще неполно, и оно также не является минимальным. Пожалуйста, прочтите codeblog.jonsket.uk/2010/08/29/writing-the-perfect-question, чтобы узнать, как задавать действительно хорошие вопросы. (Это займет некоторое время, но, честно говоря, оно того стоит в долгосрочной перспективе.)

Jon Skeet 20.12.2020 14:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
150
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте так:

if (reactionResult.Result.Emoji == yes)
{
     genres.RemoveAll(n => string.Equals(n, genre, StringComparison.OrdinalIgnoreCase));
     await ctx.Channel.SendMessageAsync("Removed " + genre + " from list. Genre list now contains " + genres.Count.ToString() + " genres").ConfigureAwait(false);
                    break;
}

Посмотрите пример на .net fiddle здесь

Компилятор считает, что использует object.Equals для сравнения genre со значениями StringComparer.OrdinalIgnoreCase вместо того, что вы ожидаете.

Это вызывает CS1503: «невозможно преобразовать System.StringComparer в System.StringComparison».

Komsur 20.12.2020 14:53

Правда, я это исправил и теперь должно работать нормально. Вам нужно использовать StringComparison.OrdinalIgnoreCase. Существует также чистая рабочий пример, чтобы проверить это.

Athanasios Kataras 20.12.2020 14:54

Да, это исправлено! Я приму это как ответ. Спасибо!

Komsur 20.12.2020 14:56

Другие вопросы по теме