Freigeben über


CA1004: Generische Methoden müssen den Typparameter angeben

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

Kategorie

Microsoft.Design

Unterbrechende Änderung

Breaking

Ursache

Die Parametersignatur einer extern sichtbaren generischen Methode enthält keine Typen, die allen Typparametern der Methode entsprechen.

Regelbeschreibung

Mithilfe eines Rückschlusses wird das Typargument einer generischen Methode nach dem Typ des an die Methode übergebenen Arguments festgelegt, anstatt nach der expliziten Spezifikation des Typarguments. Um den Rückschluss zu aktivieren, muss die Parametersignatur einer generischen Methode einen Parameter einschließen, der vom selben Typ wie der Typparameter für die Methode ist. In diesem Fall muss das Typargument nicht angegeben werden. Wenn für alle Typparameter der Rückschluss verwendet wird, sind die Syntaxen zum Aufrufen von generischen und nicht generischen Instanzenmethoden identisch. Dies vereinfacht die Verwendbarkeit generischer Methoden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, ändern Sie das Design dahingehend, dass die Parametersignatur den gleichen Typ für jeden Typparameter der Methode enthält.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel. Durch die Bereitstellung von Generika in einer einfach zu verstehenden und verwendenden Syntax wird die Zeit, die Sie zum Erlernen benötigen, reduziert und die Übernahmerate neuer Bibliotheken erhöht.

Beispiel

Im folgenden Beispiel wird die Syntax zum Aufrufen von zwei generischen Methoden veranschaulicht. Das Typargument für InferredTypeArgument wird abgeleitet, und das Typargument für NotInferredTypeArgument muss explizit angegeben werden.

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

Verwandte Regeln

CA1005: Übermäßige Anzahl von Parametern in generischen Typen vermeiden

CA1010: Auflistungen müssen eine generische Schnittstelle implementieren

CA1000: Statische Member nicht in generischen Typen deklarieren

CA1002: Generische Listen nicht verfügbar machen

CA1006: Generische Typen in Membersignaturen nicht schachteln

CA1003: Generische Ereignishandlerinstanzen verwenden

CA1007: Nach Möglichkeit Generika verwenden

Siehe auch

Referenz

Generika (C#-Programmierhandbuch)