Partager via


CA1004 : Les méthodes génériques doivent fournir un paramètre de type

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

La signature de paramètre d'une méthode générique visible de l'extérieur ne contient pas de types correspondant à tous les paramètres de type de la méthode.

Description de la règle

L'inférence désigne la manière dont l'argument de type d'une méthode générique est déterminé par le type d'argument passé à la méthode, au lieu d'utiliser la spécification explicite de l'argument de type. Pour activer l'inférence, la signature de paramètre d'une méthode générique doit contenir un paramètre du même type que le paramètre de type de la méthode. Dans ce cas, il n'est pas nécessaire de spécifier l'argument de type. Lorsque vous utilisez l'inférence pour tous les paramètres de type, la syntaxe d'appel aux méthodes d'instance génériques et non génériques est identique. Cela simplifie l'utilisation des méthodes génériques.

Comment corriger les violations

Pour corriger une violation de cette règle, modifiez le design afin que la signature de paramètre contienne un type identique pour chacun des paramètres de type de la méthode.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle. La fourniture de génériques dans une syntaxe facile à comprendre et à utiliser réduit le délai d'apprentissage nécessaire et augmente le taux d'adoption de nouvelles bibliothèques.

Exemple

L'exemple suivant illustre la syntaxe d'appel à deux méthodes génériques. L'argument de type pour InferredTypeArgument est déduit, et l'argument de type pour NotInferredTypeArgument doit être spécifié explicitement.

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

Règles connexes

CA1005 : Éviter les paramètres excessifs sur les types génériques

CA1010 : Les collections doivent implémenter une interface générique

CA1000 : Ne pas déclarer de membres statiques sur les types génériques

CA1002 : Ne pas exposer de listes génériques

CA1006 : Ne pas imbriquer les types génériques dans les signatures de membre

CA1003 : Utiliser les instances du gestionnaire d'événements génériques

CA1007 : Utiliser des classes génériques lorsque cela est approprié

Voir aussi

Référence

Génériques (guide de programmation C#)