Aggiornamento: Questo errore si verifica quando l'opzione di analisi del codice "Sopprimi risultati dal codice generato (solo gestito)" è disattivata e Set di regole è impostato su "Regole linee guida per la progettazione di base Microsoft".Perché un gestore eventi delegato vuoto causa un avviso CA1061?
In data 2013-04-26, Microsoft ha confermato che si tratta di un errore, ma non lo risolverà in questa o nella prossima versione di Visual Studio.
Inizializziamo frequentemente gestori di eventi con un delegato vuoto per evitare la necessità di controllare i valori nulli. Es .:
public EventHandler SomeEvent = delegate {};
Tuttavia, da quando ha iniziato a compilare alcuni dei nostri codice in Visual Studio 2012 (RTM), sto notando un sacco di eventi in classi derivate sono ora innescando CA1601: Do not hide base class methods avvertenze in Visual Studio analisi del codice del 2012.
Ecco un esempio che attiverà l'allarme:
using System;
using System.ComponentModel;
[assembly: CLSCompliant(true)]
namespace TestLibrary1
{
public abstract class Class1
{
public event PropertyChangedEventHandler PropertyChanged = delegate {};
}
public class Class2 : Class1
{
// this will cause a CA1061 warning
public event EventHandler SelectionCancelled = delegate { };
}
public class Class3 : Class1
{
// this will not cause a CA1061 warning
public event EventHandler SelectionCancelled;
}
}
Nota: In VS2012 l'avviso viene attivato quando compilato sia in .NET 4.5 o .NET 4.0. Lo stesso campione non attiva l'avviso in VS2010.
Motivi di prestazioni a parte, ci sono motivi legittimi per non inizializzare eventi con delegati vuoti? L'ipotesi di default è che è probabilmente solo un capriccio per l'analisi in Visual Studio 2012.
Ecco il risultato di analisi del codice per coloro che non hanno accesso a VS2012 ancora:
CA1061 non nascondere metodi della classe base Modifica o rimuovi 'Class2.Class2()' perché nasconde un metodo di classe base più specifico: 'Class1.Class1()'. TestLibrary1 Class1.cs 14
Addendum: ho trovato che l'opzione "Elimina i risultati di codice generato" nel analisi del codice è spento.
Inoltre, ho scoperto che questo sembra verificarsi quando il gestore di eventi nel tipo di base è al tempo stesso:
- un delegato diverso EventHandler EventHandler o -e-
- eventi sia la classe base e la classe derivata viene inizializzata utilizzando un metodo anonimo o un delegato vuoto (inline o nel costruttore).
Di possibile rilevanza: stiamo eseguendo Visual Studio 2012 RTM, che è stato installato sul posto nel rilascio del candidato.
Stai inizializzando i tuoi EventHandler in questo modo per evitare di dover eseguire controlli null su di essi prima di attivarli? –
Questa è la ragione predominante, sì. – Sean
Mi sembra una parvenza di VS 2012. Se dovessi sovrascrivere un delegato nella classe base, potrei forse vederlo, ma così com'è, non sembra affatto che corrisponda alla descrizione di CA1061: http : //msdn.microsoft.com/en-us/library/ms182143.aspx –