CA1004: I metodi generici devono fornire parametri di tipo
TypeName |
GenericMethodsShouldProvideTypeParameter |
CheckId |
CA1004 |
Category |
Microsoft.Design |
Breaking Change |
Breaking |
Causa
La firma di parametro di un metodo generico visibile esternamente non contiene tipi che corrispondono a tutti i parametri di tipo del metodo.
Descrizione della regola
Per inferenza si intende la procedura con cui viene determinato l'argomento di tipo di un metodo generico in base al tipo di argomento passato al metodo, piuttosto che in base alla specifica esplicita dell'argomento di tipo. Per consentire l'inferenza, la firma di parametro di un metodo generico deve includere un parametro dello stesso tipo del parametro di tipo relativo al metodo. In tal caso non è necessario specificare l'argomento di tipo. Quando si utilizza l'inferenza per tutti i parametri di tipo, la sintassi per la chiamata di metodi di istanza generici e non generici è identica. In tal modo l'utilizzabilità dei metodi generici viene semplificata.
Come correggere le violazioni
Per correggere una violazione di questa regola, modificare la progettazione in modo che la firma di parametro contenga lo stesso tipo per ciascun parametro di tipo del metodo.
Esclusione di avvisi
Non escludere un avviso da questa regola. La presenza di generics in una sintassi facile da comprendere e utilizzare riduce il tempo necessario all'apprendimento e aumenta la frequenza di adozione di nuove librerie.
Esempio
Nell'esempio riportato di seguito è illustrata la sintassi per chiamare due metodi generici. L'argomento di tipo relativo a InferredTypeArgument viene dedotto, mentre l'argomento di tipo relativo a NotInferredTypeArgument deve essere specificato in maniera esplicita.
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);
}
}
}
Regole correlate
CA1005: Evitare un uso eccessivo di parametri nei tipi generici
CA1010: Gli insiemi devono implementare un'interfaccia generica
CA1000: Non dichiarare membri statici su tipi generici
CA1002: Non esporre elenchi generici
CA1006: Non annidare tipi generici nelle firme dei membri
Ca1003: Utilizzare istanze di gestori eventi generici
CA1007: Utilizzare generics dove appropriato