Udostępnij za pośrednictwem


CA1004: Generyczne metody powinny dostarczyć parametry typu

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

Kategoria

Microsoft.Design

Zmiana kluczowa

Kluczowa

Przyczyna

Podpis parametru widocznej z zewnątrz metody generycznej nie zawiera typów, które odpowiadają wszystkim parametrom typu metody.

Opis reguły

Wnioskowanie to ustalenie argumentu typu metody generycznej poprzez typ argumentu przekazanego do metody, zamiast użycia jawnej specyfikacji argumentu typu.Aby włączyć wnioskowanie, podpis parametru metody generycznej musi zawierać parametr, który jest tego samego typu co parametr typu dla metody.W tym przypadku argument typu nie musi zostać określony.W przypadku używania wnioskowania dla wszystkich parametrów typu, składnia wywołania wystąpienia metod generycznych i niegenerycznych jest identyczna.Upraszcza to użyteczność metod generycznych.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zmienić projekt tak, aby podpis parametru zawierał ten sam typ dla każdego parametru typu metody.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.Dostarczanie ogólników w składni, które są łatwe do zrozumienia i użycia, skraca czas wymagany do nauki i zwiększa szybkość procesu wdrażania nowych bibliotek.

Przykład

W poniższym przykładzie przedstawiono składnię wywołania dwóch metod generycznych.Argument typu dla InferredTypeArgument jest wywnioskowany a argument typu dla NotInferredTypeArgument musi zostać jawnie określony.

Imports System

Namespace DesignLibrary

   Public Class Inference

      ' This method violates the rule. 
      Sub NotInferredTypeArgument(Of T)()

         Console.WriteLine(GetType(T))

      End Sub 

      ' This method satisfies the rule. 
      Sub InferredTypeArgument(Of T)(sameAsTypeParameter As T)

         Console.WriteLine(sameAsTypeParameter)

      End Sub 

   End Class 

   Class Test

      Shared Sub Main()

         Dim infer As New Inference()
         infer.NotInferredTypeArgument(Of Integer)()
         infer.InferredTypeArgument(3)

      End Sub 

   End Class 

End Namespace
using System;

namespace DesignLibrary
{
   public class Inference
   {
      // This method violates the rule. 
      public void NotInferredTypeArgument<T>()
      {
         Console.WriteLine(typeof(T));
      }

      // This method satisfies the rule. 
      public void InferredTypeArgument<T>(T sameAsTypeParameter)
      {
         Console.WriteLine(sameAsTypeParameter);
      }
   }

   class Test
   {
      static void Main()
      {
         Inference infer = new Inference();
         infer.NotInferredTypeArgument<int>();
         infer.InferredTypeArgument(3);
      }
   }
}

Powiązane reguły

CA1005: Unikaj nadużywania parametrów na typach generycznych

CA1010: Kolekcje powinny implementować interfejs generyczny

CA1000: Nie deklaruj statycznych elementów członkowskich na typach generycznych

CA1002: Nie ujawniaj list generycznych

CA1006: Nie zagnieżdżaj typów generycznych w podpisach elementu członkowskiego

CA1003: Użyj wystąpień obsługi zdarzeń generycznych

CA1007: Używaj danych generycznych wszędzie, gdzie jest to odpowiednie

Zobacz też

Informacje

Typy ogólne (Przewodnik programowania w języku C#)