Condividi tramite


CA1061: Non nascondere i metodi di una classe base

TypeName

DoNotHideBaseClassMethods

CheckId

CA1061

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo derivato consente di dichiarare un metodo con lo stesso nome e numero di parametri di uno dei relativi metodi base; uno o più parametri sono un tipo base del parametro corrispondente nel metodo base, mentre i rimanenti parametri dispongono di tipi identici ai parametri corrispondenti nel metodo base.

Descrizione della regola

Un metodo di un tipo base è nascosto da un metodo con lo stesso nome in un tipo derivato quando la firma di parametro del metodo derivato differisce solo dai tipi che sono derivati in modo più debole rispetto ai tipi corrispondenti nella firma di parametro del metodo base.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere o rinominare il metodo oppure modificare la firma di parametro in modo che il metodo non nasconda il metodo base.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un metodo che viola la regola.

using System;

namespace DesignLibrary
{
   class BaseType
   {
      internal void MethodOne(string inputOne, object inputTwo)
      {
         Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
      }

      internal void MethodTwo(string inputOne, string inputTwo)
      {
         Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
      }
   }

   class DerivedType : BaseType
   {
      internal void MethodOne(string inputOne, string inputTwo)
      {
         Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
      }

      // This method violates the rule.
      internal void MethodTwo(string inputOne, object inputTwo)
      {
         Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
      }
   }

   class Test
   {
      static void Main()
      {
         DerivedType derived = new DerivedType();

         // Calls DerivedType.MethodOne.
         derived.MethodOne("string1", "string2");

         // Calls BaseType.MethodOne.
         derived.MethodOne("string1", (object)"string2");

         // Both of these call DerivedType.MethodTwo.
         derived.MethodTwo("string1", "string2");
         derived.MethodTwo("string1", (object)"string2");
      }
   }
}