Métodos genéricos devem fornecer o parâmetro de tipo
TypeName |
GenericMethodsShouldProvideTypeParameter |
CheckId |
CA1004 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
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 tipos dos parâmetros do método.
Descrição da regra
Inferência é como o argumento Tipo de um método genérico é determinado pelo tipo de argumento passado ao método, em vez de pela especificação explícita de argumento de tipo.Para habilitar a inferência, a assinatura de parâmetro de um método genérico deve incluir um parâmetro que seja do mesmo tipo do parâmetro de tipo para o método.Nesse caso, o argumento de tipo não tem a ser especificado.Ao usar inferência para todos os parâmetros de tipo, a sintaxe para chamar os métodos de instância genérica e não genéricas é idêntica.Isso simplifica o uso de métodos genéricos.
Como corrigir violações
Para corrigir uma violação dessa regra alterar o design para que a assinatura de parâmetro contém um tipo idêntico para cada um dos tipos dos parâmetros do método.
Quando suprimir avisos
Não suprimir um aviso da regra.Fornecer genéricos em uma sintaxe que seja fácil de entender e usar reduz o time 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 dois métodos genéricos.O argumento Tipo de InferredTypeArgument é inferido, enquanto o argumento de tipo para 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
Evitar o excesso parâmetros em tipos genéricos
Coleções devem implementar a interface genérica
Não declarará membros estático tipos genéricos
Não se aninham tipos genéricos em assinaturas de membro
Usar instâncias de manipulador do evento genérico
Use genéricos onde for apropriado