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