2009-07-07 10 views
60

Par exemple, je reçois cet avertissement du compilateur, "Comment se débarrasser des avertissements du compilateur "[un événement] jamais utilisé" dans Visual Studio?

L'événement « Company.SomeControl.SearchClick » est jamais utilisé.

Mais je sais qu'il est utilisé parce que le commenter me jette dehors comme 20 nouveaux avertissements de pages XAML qui essaient d'utiliser cet événement!

Qu'est-ce qui se passe? est-il une astuce pour se débarrasser de cet avertissement?

+1

Pouvez-vous s'il vous plaît poster un exemple? –

Répondre

95

Cela semble être warning 67 et peuvent donc être supprimés avec:

#pragma warning disable 67 

Ne pas oublier de restaurer le plus rapidement possible (après la déclaration de l'événement) avec:

#pragma warning restore 67 

Cependant, je vérifie à nouveau et m'assure que vous êtes soulevant l'événement quelque part, pas juste en vous inscrivant à elle. Le fait que le compilateur recrache 20 avertissements et non 20 erreurs lorsque vous commentez l'événement est également suspect ...

Il y a aussi an interesting article à propos de cet avertissement et notamment son application aux interfaces; il y a une bonne suggestion sur la façon de gérer les événements "inutilisés".

+0

C'est exactement ce dont j'ai besoin! Je vous remercie! La seule différence est que j'ai ajouté mon propre commentaire à côté de la 67 donc je savais ce que c'était dans le futur. Voici "exactement" ce que j'ai tapé ... #pragma warning disable 67 // événement jamais utilisé public event RoutedEventHandler SearchClick; #pragma warning restore 67 – jedmao

+10

C'est un très bon lien. Merci. –

+0

Ceci est utile; ne va pas rester en place, mais juste quelque chose pour avoir une idée en cours d'exécution ... – dudeNumber4

1

Le compilateur est apparemment pas au courant que c'est être utilisé dans le code XAML. Essayez de supprimer l'avertissement dans votre définition d'événement.

De même, assurez-vous d'élever l'événement quelque part.

+0

C'est ce que je pensais aussi, donc j'ai déplacé le code XAML vers le code derrière et il a montré le même avertissement! Et oui, je suis sûr à 100% que l'événement est soulevé quelque part. Je regarde ça. Il est connecté à un bouton. – jedmao

0

Vous pouvez supprimer les avertissements individuels.

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

Dans ce cas, CS0219 est l'avertissement concernant les variables affectées mais non utilisées. Vous pouvez soit utiliser le flag/nowarn: 0219, soit ajouter le numéro d'erreur dans le volet des propriétés du projet (sous "Build", n'oubliez pas de supprimer le CS principal). Gardez à l'esprit les supresses tous les avertissements de cette classe.

+0

Bon à savoir! Merci :) – jedmao

57

Si vous êtes contraint d'implémenter un événement à partir d'une interface dont votre implémentation n'a pas besoin, vous pouvez procéder comme suit pour éviter l'avertissement.

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

+1 Great info, thanks! –

+0

Si je fais cela, il est dit plus tard dans le fichier où je fais 'if (OnCompleteOpenEvent! = Null) OnCompleteOpenEvent();' que "OnCompleteEvent n'existe pas dans le contexte actuel". – Almo

+0

@Almo, c'est correct. Cependant, vous décrivez le cas où vous utilisez l'événement et donc l'avertissement ne s'afficherait pas, donc vous n'utiliserez pas le correctif pour l'avertissement. Droite? Généralement, vous avez une interface spécifiant l'événement et deux sous-classes. On n'utilise pas l'événement et utilise cette solution. L'autre utilise l'événement et n'a jamais lancé l'avertissement pour commencer. –

1

Ou vous pouvez ajouter à votre projet <NoWarn>67</NoWarn>

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

cela désactivera l'avertissement dans l'ensemble du projet potentiellement cacher des problèmes réels avec des événements inutilisés. – vidstige

12

La deuxième meilleure façon est AMHA d'indiquer clairement que l'événement est pas pris en charge en lançant une exception si quelqu'un essaie de s'y abonner.

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

En tant que variante de cela, vous pouvez aussi simplement laisser les add et remove méthodes vides d'ignorer silencieusement les souscriptions à l'événement.

La meilleure solution est de refactoriser le code, peut-être de tirer la déclaration de l'événement à l'implémenteur si possible.

En dernier recours, vous pouvez également désactiver l'avertissement comme si

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