Как мне избавиться от "[some event] никогда не использовавшегося" предупреждения компилятора в Visual Studio?

Например, я получаю это предупреждение компилятора,

Событие Company.SomeControl.SearchClick никогда не используется.

Но я знаю, что он использовался, потому что комментируя это, я получаю 20 новых предупреждений о страницах XAML, которые пытаются использовать это событие!

Что дает? Есть ли хитрость, чтобы избавиться от этого предупреждения?

Ответ 1

Похоже, что это предупреждение 67 и может быть подавлено с помощью:

#pragma warning disable 67

Не забудьте восстановить его как можно скорее (после объявления события) с помощью:

#pragma warning restore 67

Тем не менее, я бы еще раз проверил и убедился, что вы где-то поднимаете событие, а не просто подписываетесь на него. Тот факт, что компилятор выдает 20 предупреждений, а не 20 ошибок при комментировании события, также является подозрительным...

Там также интересная статья об этом предупреждении и, в частности, как оно применяется к интерфейсам; есть хорошее предложение о том, как бороться с "неиспользованными" событиями. К сожалению, эта ссылка кажется (временно?) Мертвой сейчас, но важными частями являются:

Правильный ответ должен быть ясным о том, что вы ожидаете от события, что в данном случае ничего не значит:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

Это будет чисто подавлять предупреждение, а также дополнительную реализацию обычного события, генерируемую компилятором. И, как еще одно дополнительное преимущество, он заставляет задуматься о том, является ли эта реализация, которая ничего не делает, действительно лучшей реализацией. Например, если событие не так уж важно, так как оно не поддерживается, так что клиенты, которые полагаются на функциональность, могут потерпеть неудачу без него, может быть лучше явно указать на отсутствие поддержки и быстро выполнить сбой, бросая исключение:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

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

Ответ 2

Если вы вынуждены внедрять событие из интерфейса, что ваша реализация не нужна, вы можете сделать следующее, чтобы избежать предупреждения.

public event EventHandler CanExecuteChanged { add{} remove{} }

Ответ 3

Вторым лучшим способом является imho, чтобы четко указать, что событие не поддерживается путем исключения исключения, если кто-то пытается подписаться на него.

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { }
}

В качестве варианта этого вы также можете просто оставить методы add и remove пустыми, чтобы молча игнорировать подписки на событие.

Лучшее решение для рефакторинга кода, возможно, по возможности притягивает объявление события к разработчику.

В качестве последнего средства вы также можете отключить предупреждение таким образом

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

Ответ 4

Компилятор, по-видимому, не знает, что он используется в коде XAML. Попробуйте подавить предупреждение в определении вашего события.

Кроме того, убедитесь, что вы где-то поднимаете событие.

Ответ 5

Вы можете подавить индивидуальные предупреждения.

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

В этом случае CS0219 является предупреждением о назначении переменных, но не используется. Вы можете либо использовать флаг /nowarn: 0219, либо добавить номер ошибки в области свойств для проекта (в разделе "Сборка", не забудьте удалить ведущую CS). Имейте в виду, что все предупреждения этого класса подавляются.

Ответ 6

Или вы можете добавить <NoWarn>67</NoWarn> в свой проект

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

Ответ 7

Вы также можете сделать следующее:

public event EventHandler MyEvent = delegate {}