Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA1033 |
| Title | I metodi di interfaccia devono poter essere richiamati dai tipi figlio |
| Categoria | Progettazione |
| La correzione causa un'interruzione o meno | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | No |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Un tipo visibile esternamente non sigillato fornisce l'implementazione esplicita di un metodo di un'interfaccia pubblica e non fornisce un metodo alternativo visibile esternamente con lo stesso nome.
Descrizione regola
Si consideri un tipo di base che implementa in modo esplicito un metodo di interfaccia pubblica. Un tipo che deriva dal tipo di base può accedere al metodo di interfaccia ereditato solo tramite un riferimento all'istanza corrente (this in C#) di cui viene eseguito il cast all'interfaccia. Se il tipo derivato riimplementa (in modo esplicito) il metodo di interfaccia ereditato, non è più possibile accedere all'implementazione di base. La chiamata tramite il riferimento all'istanza corrente invocherà l'implementazione derivata; ciò provoca la ricorsività e un conseguente overflow dello stack.
Questa regola non segnala una violazione per un'implementazione esplicita di System.IDisposable.Dispose quando viene fornito un metodo Close() o System.IDisposable.Dispose(Boolean) visibile esternamente.
Come correggere le violazioni
Per correggere una violazione di questa regola, implementare un nuovo metodo che offra la stessa funzionalità e che sia visibile ai tipi derivati oppure modificare a un'implementazione non esplicita. Se una modifica di rilievo è accettabile, un'alternativa consiste nel sigillare il tipo.
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola se viene fornito un metodo visibile esternamente con la stessa funzionalità, ma un nome diverso rispetto al metodo implementato in modo esplicito.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempio
Nell'esempio seguente viene illustrato un tipo, ViolatingBase, che viola la regola e un tipo , FixedBase, che mostra una correzione per la violazione.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}