Wie entferne ich Compiler-Warnungen "[ein Ereignis] nie verwendet" in Visual Studio?

93

Zum Beispiel erhalte ich diese Compiler-Warnung:

Das Ereignis 'Company.SomeControl.SearchClick' wird niemals verwendet.

Aber ich weiß, dass es verwendet wird, weil das Auskommentieren mich wie 20 neue Warnungen vor XAML-Seiten auslöst, die versuchen, dieses Ereignis zu verwenden!

Was gibt? Gibt es einen Trick, um diese Warnung loszuwerden?

jedmao
quelle
1
Können Sie bitte ein Beispiel posten?
John Saunders

Antworten:

140

Dies scheint eine Warnung 67 zu sein und kann daher unterdrückt werden mit:

#pragma warning disable 67

Vergessen Sie nicht, es so schnell wie möglich (nach der Ereignisdeklaration) wiederherzustellen mit:

#pragma warning restore 67

Ich würde jedoch noch einmal überprüfen und stellen Sie sicher , dass Sie erhöhen die Veranstaltung irgendwo, nicht nur abonniert zu. Die Tatsache, dass der Compiler 20 Warnungen und nicht 20 Fehler ausspuckt, wenn Sie das Ereignis auskommentieren, ist ebenfalls verdächtig ...

Es gibt auch einen interessanten Artikel über diese Warnung und speziell darüber, wie sie für Schnittstellen gilt. Es gibt einen guten Vorschlag, wie man mit "unbenutzten" Ereignissen umgeht. Die wichtigen Teile sind:

Die richtige Antwort ist, explizit anzugeben, was Sie von der Veranstaltung erwarten, was in diesem Fall nichts ist:

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

Dadurch werden die Warnung sowie die zusätzliche vom Compiler generierte Implementierung eines normalen Ereignisses sauber unterdrückt. Und als weiteren zusätzlichen Vorteil muss man darüber nachdenken, ob diese Nichtstun-Implementierung wirklich die beste Implementierung ist. Wenn das Ereignis beispielsweise nicht so unwichtig ist, sondern nicht unterstützt wird, sodass Clients, die sich auf die Funktionalität verlassen, wahrscheinlich ohne diese Funktion fehlschlagen, ist es möglicherweise besser, den Mangel an Unterstützung explizit anzugeben und schnell zu scheitern, indem Sie eine auslösen Ausnahme:

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

Natürlich ist eine Schnittstelle, die ohne einige Teile ihrer Funktionalität sinnvoll implementiert werden kann, manchmal ein Hinweis darauf, dass die Schnittstelle nicht optimal zusammenhängend ist und in separate Schnittstellen aufgeteilt werden sollte.

lc.
quelle
Genau das brauche ich! Danke dir! Der einzige Unterschied ist, dass ich neben der 67 meinen eigenen Kommentar hinzugefügt habe, damit ich wusste, was es in Zukunft war. Hier ist "genau", was ich eingegeben habe ... #pragma warning disable 67 // Ereignis hat nie öffentliches Ereignis verwendet RoutedEventHandler SearchClick; #pragma Warnung wiederherstellen 67
jedmao
12
Das ist eine großartige Verbindung. Vielen Dank.
Max Palmer
Das ist nützlich;
Ich
78

Wenn Sie gezwungen sind, ein Ereignis über eine Schnittstelle zu implementieren, das Ihre Implementierung nicht benötigt, können Sie Folgendes tun, um die Warnung zu vermeiden.

public event EventHandler CanExecuteChanged { add{} remove{} }
Adam Mills
quelle
Wenn ich das mache, steht später in der Datei, in der ich das mache if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();, "OnCompleteEvent existiert im aktuellen Kontext nicht".
Almo
@Almo, das ist richtig. Sie beschreiben jedoch den Fall, in dem Sie das Ereignis verwenden und die Warnung daher nicht angezeigt wird, sodass Sie den Fix für die Warnung nicht verwenden würden. Richtig? Normalerweise haben Sie eine Schnittstelle, die das Ereignis angibt, und zwei Unterklassen. Man benutzt das Ereignis nicht und benutzt diese Lösung. Der andere nutzt das Ereignis und hat die Warnung zunächst nie ausgelöst.
Dirk Bester
Es ist zu lange her, aber wir haben diesen Fehler erhalten, obwohl er verwendet wurde. Hatte etwas damit zu tun, dass es so definiert wurde, dass der Compiler dachte, es würde nicht verwendet.
Almo
Vielen Dank für diese einfache Lösung für eine sehr verrückte Situation!
M463
14

Der zweitbeste Weg ist imho, klar zu sagen, dass das Ereignis nicht durch Auslösen einer Ausnahme unterstützt wird, wenn jemand versucht, es zu abonnieren.

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

Als Variante können Sie auch die Methoden addund einfach removeleer lassen, um Abonnements für das Ereignis stillschweigend zu ignorieren.

Die beste Lösung besteht darin, den Code umzugestalten und die Deklaration des Ereignisses nach Möglichkeit an den Implementierer zu senden.

Als letzten Ausweg können Sie die Warnung auch so deaktivieren

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
vidstige
quelle
Ich sehe nicht, wie null Objekte hier relevant sind
vidstige
Ich weiß, was ein Nullobjekt ist, und dieser Anwendungsfall wird im letzten Absatz behandelt. Bitte lesen Sie die gesamte Antwort sorgfältig durch.
Vidstige
Ich weiß, was ein Nullobjekt ist. Ich glaube, dieser Anwendungsfall wird in meinem letzten Absatz behandelt.
vidstige
3

Sie können auch Folgendes tun:

public event EventHandler MyEvent = delegate {}
GrantA
quelle
1

Dem Compiler ist anscheinend nicht bekannt, dass er im XAML-Code verwendet wird. Versuchen Sie, die Warnung in Ihrer Ereignisdefinition zu unterdrücken.

Stellen Sie außerdem sicher, dass Sie das Ereignis tatsächlich irgendwo auslösen.

SLaks
quelle
Das habe ich auch gedacht, also habe ich den XAML-Code in den Code dahinter verschoben und es wurde dieselbe Warnung angezeigt! Und ja, ich bin zu 100% sicher, dass das Ereignis irgendwo ausgelöst wird. Ich schaue genau hin. Es ist mit einem Knopf verbunden.
jedmao
1

Sie können einzelne Warnungen unterdrücken.

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

In diesem Fall ist CS0219 die Warnung bezüglich Variablen, die zugewiesen, aber nicht verwendet werden. Sie können entweder das Flag / nowarn: 0219 verwenden oder die Fehlernummer im Eigenschaftenbereich für das Projekt hinzufügen (denken Sie unter "Erstellen" daran, die führende CS zu entfernen). Beachten Sie, dass alle Warnungen dieser Klasse unterdrückt werden .

Svend
quelle
1

Oder Sie können <NoWarn>67</NoWarn>Ihrem Projekt hinzufügen

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
Simon
quelle
9
Dadurch wird die Warnung im gesamten Projekt deaktiviert, wodurch möglicherweise echte Probleme mit nicht verwendeten Ereignissen ausgeblendet werden.
Vidstige