Как мне избавиться от предупреждений компилятора «[какое-то событие] никогда не использовалось» в Visual Studio?


93

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

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

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

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


1
Не могли бы вы опубликовать пример?
Джон Сондерс,

Ответы:


145

Это похоже на предупреждение 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 { }
}

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


Это именно то, что мне нужно! Спасибо! Единственная разница в том, что я добавил свой комментарий рядом с 67, чтобы я знал, что это будет в будущем. Вот «именно» то, что я набрал ... #pragma warning disable 67 // событие никогда не использовалось публичное событие RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao 07

12
Это отличная ссылка. Спасибо.
Макс Палмер

Это полезно; не собираюсь держать на месте, но просто что-то, чтобы
реализовать

78

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

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

Если я сделаю это, позже в файле, где я это сделаю, будет сказано, if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();что «OnCompleteEvent не существует в текущем контексте».
Almo

@Almo, это правильно. Однако вы описываете случай, когда вы ИСПОЛЬЗУЕТЕ событие, поэтому предупреждение не будет отображаться, поэтому вы не сможете использовать исправление для предупреждения. Правильно? Обычно у вас есть интерфейс, определяющий событие и два подкласса. Событие не используют, а используют это решение. Другой действительно использует событие и никогда не выдавал предупреждения.
Дирк Бестер,

Прошло слишком много времени, но мы получали эту ошибку, хотя она использовалась. Имел какое-то отношение к тому, что он был определен таким образом, чтобы заставить компилятор думать, что он не используется.
Almo

Большое спасибо за это простое решение очень сводящей с ума ситуации!
M463

16

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

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

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

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

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

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

Я не понимаю, насколько здесь
уместны

Я знаю, что такое нулевой объект, и этот вариант использования описан в последнем абзаце. Пожалуйста, прочтите внимательно ответ полностью.
vidstige

Я знаю, что такое нулевой объект. Я считаю, что этот вариант использования описан в моем последнем абзаце.
vidstige

3

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

public event EventHandler MyEvent = delegate {}

1

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

Также убедитесь, что вы действительно где-то поднимаете событие.


Я тоже так подумал, поэтому переместил код XAML в код позади, и он показал такое же предупреждение! И да, я на 100% уверен, что событие где-то поднимается. Я смотрю прямо на это. Он подключен к кнопке.
jedmao 07

1

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

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

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


1

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

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

9
это отключит предупреждение во всем проекте, потенциально скрывая реальные проблемы с неиспользуемыми событиями.
vidstige 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.