У меня есть список жанров, и я пытаюсь удалить жанр, который пользователь добавит в него, независимо от случая. Я указал строковую переменную с именем «жанр» выше в коде, но получаю 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», и я не уверен, почему. Кроме того, жанры списка строк.
Если бы кто-нибудь мог мне помочь, это было бы очень хорошо. Заранее спасибо!
Это не статично, это одна из переменных, которые я настроил в асинхронной задаче. «Удалить общедоступную асинхронную задачу (CommandContext ctx, строковый жанр)».
@Komsur: Вот почему полезно показать минимальный воспроизводимый пример - поэтому нам не нужно угадывать такие вещи ... Точно так же мы не знаем тип genres.
Это список строк.
@Komsur: Но опять же, если бы вы показали это на минимальном воспроизводимом примере , нам бы не пришлось спрашивать. То, что у вас есть сейчас, лучше (в том смысле, что это показывает genre), но оно все еще неполно, и оно также не является минимальным. Пожалуйста, прочтите codeblog.jonsket.uk/2010/08/29/writing-the-perfect-question, чтобы узнать, как задавать действительно хорошие вопросы. (Это займет некоторое время, но, честно говоря, оно того стоит в долгосрочной перспективе.)





Попробуйте так:
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».
Правда, я это исправил и теперь должно работать нормально. Вам нужно использовать StringComparison.OrdinalIgnoreCase. Существует также чистая рабочий пример, чтобы проверить это.
Да, это исправлено! Я приму это как ответ. Спасибо!
Каково определение «жанра»? Может он статический?