CA1033 : Les méthodes d'interface doivent pouvoir être appelées par les types enfants
Propriété | Value |
---|---|
Identificateur de la règle | CA1033 |
Titre | Les méthodes d'interface doivent pouvoir être appelées par les types enfants |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Un type unsealed visible de l'extérieur fournit une implémentation de méthode explicite d'une interface publique mais ne fournit aucune méthode de substitution visible de l'extérieur de même nom.
Description de la règle
Considérez un type de base qui implémente explicitement une méthode d’interface publique. Un type qui dérive du type de base peut accéder à la méthode d’interface héritée uniquement via une référence à l’instance actuelle (this
en C#) qui est castée dans l’interface. Si le type dérivé implémente à nouveau (explicitement) la méthode d’interface héritée, l’implémentation de base n’est plus accessible. L’appel via la référence instance actuelle appelle l’implémentation dérivée ; cela entraîne une récursion et un éventuel dépassement de pile.
Cette règle ne signale pas de violation pour une implémentation explicite de System.IDisposable.Dispose lorsqu’une méthode Close()
ou System.IDisposable.Dispose(Boolean)
visible en externe est fournie.
Comment corriger les violations
Pour corriger une violation de cette règle, implémentez une nouvelle méthode qui expose les mêmes fonctionnalités et est visible pour les types dérivés ou modifiez une implémentation qui n’est pas explicite. Si un changement cassant est acceptable, une autre solution consiste à sceller le type.
Quand supprimer les avertissements
Il est prudent de supprimer un avertissement de cette règle si une méthode visible de l’extérieur est fournie qui a la même fonctionnalité, mais un nom différent de celui de la méthode explicitement implémentée.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemple
L’exemple suivant montre un type, ViolatingBase
, qui enfreint la règle et un type, FixedBase
, qui montre un correctif pour la violation.
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();
}
}