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();
    }
}

Voir aussi