Condividi tramite


CA2222: Non diminuire la visibilità di membri ereditati

TypeName

DoNotDecreaseInheritedMemberVisibility

CheckId

CA2222

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un metodo privato in un tipo non sealed presenta una firma identica a un metodo pubblico dichiarato in un tipo di base.Il metodo privato non è finale.

Descrizione della regola

Non modificare il modificatore di accesso per i membri ereditati.La modifica in privato di un membro ereditato non impedisce ai chiamanti di accedere all'implementazione della classe base del metodo.Se il membro è reso privato e il tipo è non sealed, i tipi che ereditano possono chiamare l'ultima implementazione pubblica del metodo nella gerarchia di ereditarietà.Se è necessario modificare il modificatore di accesso, il metodo deve essere contrassegnato come finale oppure il relativo tipo deve essere sealed per impedire che il metodo venga sottoposto a ovverride.

Come correggere le violazioni

Per correggere una violazione di questa regola, impostare l'accesso su non privato.In alternativa, è possibile rendere il metodo finale, purché il linguaggio di programmazione supporti tale operazione.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola questa regola.

Imports System

Namespace UsageLibrary
Public Class ABaseType

   Public Sub BasePublicMethod(argument1 As Integer)
   End Sub 'BasePublicMethod

End Class 'ABaseType 

Public Class ADerivedType
   Inherits ABaseType

   ' Violates rule DoNotDecreaseInheritedMemberVisibility. 
   Private Shadows Sub BasePublicMethod(argument1 As Integer)
   End Sub 'BasePublicMethod
End Class 'ADerivedType

End Namespace
using System;
namespace UsageLibrary
{
    public class ABaseType
    {
        public void BasePublicMethod(int argument1) {}
    }
    public class ADerivedType:ABaseType
    {
        // Violates rule: DoNotDecreaseInheritedMemberVisibility. 
        // The compiler returns an error if this is overridden instead of new. 
        private new void BasePublicMethod(int argument1){}       
    }
}