CA1033: Los tipos secundarios deben poder llamar a los métodos de interfaz

Propiedad Value
Identificador de la regla CA1033
Título Los tipos secundarios deben poder llamar a los métodos de interfaz
Categoría Diseño
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Un tipo no sellado visible externamente proporciona un método explícito de implementación de una interfaz pública pero no proporciona un método visible externamente alternativo con el mismo nombre.

Descripción de la regla

Considere un tipo base que implementa de forma explícita un método de interfaz pública. Un tipo que se deriva del tipo base solo puede acceder al método de interfaz heredado mediante una referencia a la instancia actual (this en C#) que se convierte en la interfaz. Si el tipo derivado implementa (explícitamente) el método de interfaz heredado, ya no se puede acceder a la implementación base. La llamada mediante la referencia de la instancia actual invocará la implementación derivada, lo que produce recursividad y, por consiguiente, un desbordamiento de pila.

Esta regla no notifica una infracción de una implementación explícita de System.IDisposable.Dispose cuando se proporciona un método Close() o System.IDisposable.Dispose(Boolean) visible externamente.

Cómo corregir infracciones

Para corregir una infracción de esta regla, implemente un nuevo método que exponga la misma funcionalidad y sea visible para los tipos derivados, o bien cambie a una implementación no explícita. Si es factible realizar un cambio importante, una alternativa es convertir el tipo en sellado.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si se proporciona un método visible externamente con la misma funcionalidad, pero con un nombre diferente del método implementado explícitamente.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el ejemplo siguiente se muestra un tipo, ViolatingBase, que infringe la regla y un tipo, FixedBase, que muestra una corrección para la infracción.

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

Consulte también