Les méthodes génériques doivent fournir le paramètre de type
Mise à jour : novembre 2007
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. Lors de l'utilisation de 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, tandis que 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
Éviter les paramètres excessifs sur les types génériques
Les collections doivent implémenter l'interface générique
Ne pas déclarer de membres statiques sur les types génériques
Ne pas exposer de listes génériques
Ne pas imbriquer les types génériques dans les signatures de membre
Utiliser des instances du gestionnaire d'événements génériques
Utiliser des classes génériques lorsque nécessaire