CA1004: Métodos genéricos devem fornecer o parâmetro de tipo
TypeName |
GenericMethodsShouldProvideTypeParameter |
CheckId |
CA1004 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Quebrando |
Causa
A assinatura de parâmetro de um método genérico visível externamente não contém tipos que correspondem a todos os parâmetros de tipo do método.
Descrição da regra
Inferência é como o argumento de tipo de um método genérico é determinado pelo tipo de argumento passado para o método, em vez de pela especificação do argumento de tipo explícita. Para habilitar a inferência de tipos, a assinatura de parâmetro de um método genérico deve incluir um parâmetro que é do mesmo tipo do parâmetro de tipo para o método. Nesse caso, o argumento de tipo não precisará ser especificada. Quando você usa a inferência de tipos para todos os parâmetros de tipo, a sintaxe para chamada dos métodos de instância genéricas e é idêntica. Isso simplifica a usabilidade de métodos genéricos.
Como corrigir violações
Para corrigir uma violação desta regra, altere o design para que a assinatura de parâmetro contém o mesmo tipo para cada parâmetro do tipo do método.
Quando suprimir avisos
Não suprimir um aviso da regra. Fornecer uma sintaxe fácil de entender e usar os genéricos reduz o tempo que é necessário para aprender e aumenta a taxa de adoção de novas bibliotecas.
Exemplo
O exemplo a seguir mostra a sintaxe para chamar os dois métodos genéricos. O argumento de tipo de InferredTypeArgument é inferido e o argumento de tipo de NotInferredTypeArgument deve ser especificado explicitamente.
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);
}
}
}
Regras relacionadas
CA1005: Evitar o excesso parâmetros em tipos genéricos
CA1010: Coleções devem implementar a interface genérica
CA1000: Não é declarar membros estáticos em tipos genéricos
CA1002: Não expõem listas genéricas
CA1006: Não se aninham tipos genéricos em assinaturas de membro
CA1003: Usar instâncias do manipulador de evento genérico
CA1007: Use genéricos onde for apropriado