CA1033: I metodi di interfaccia devono essere richiamabili dai tipi figlio
Proprietà | valore |
---|---|
ID regola | CA1033 |
Title | I metodi di interfaccia devono essere richiamabili dai tipi figlio |
Categoria | Progettazione |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Un tipo visibile esternamente non sealed fornisce un'implementazione di metodo esplicita di un'interfaccia pubblica e non fornisce un metodo visibile esternamente alternativo 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 richiamerà l'implementazione derivata; ciò causa la ricorsione e un overflow dello stack finale.
Questa regola non segnala una violazione per un'implementazione esplicita di System.IDisposable.Dispose quando viene fornito un metodo o System.IDisposable.Dispose(Boolean)
visibile Close()
esternamente.
Come correggere le violazioni
Per correggere una violazione di questa regola, implementare un nuovo metodo che espone la stessa funzionalità ed è visibile ai tipi derivati o a un'implementazione nonxplicit. Se una modifica di rilievo è accettabile, un'alternativa consiste nel rendere bloccato 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();
}
}