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é