Partilhar via


CA1004: Métodos genéricos devem fornecer um parâmetro de tipo

Item Valor
RuleId CA1004
Categoria Microsoft.Design
Alteração da falha Quebra

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 da especificação explícita do argumento de tipo. Para habilitar a inferência, a assinatura do 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 precisa ser especificado. Quando você usa inferência para todos os parâmetros de tipo, a sintaxe para chamar métodos de instância genéricos e não genéricos é idêntica. Isso simplifica a usabilidade dos métodos genéricos.

Como corrigir violações

Para corrigir uma violação dessa regra, altere o design de modo que a assinatura de parâmetro contenha o mesmo tipo para cada parâmetro de tipo do método.

Quando suprimir avisos

Não suprima um aviso nessa regra. Fornecer genéricos em uma sintaxe fácil de entender e usar reduz o tempo 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 de tipo para InferredTypeArgument é inferido, e 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);
      }
   }
}

CA1005: Evitar parâmetros excessivos em tipos genéricos

CA1010: Coleções devem implementar uma interface genérica

CA1000: Não declarar membros estáticos em tipos genéricos

CA1002: Não expor listas genéricas

CA1006: Não aninhar tipos genéricos em assinaturas de membro

CA1003: Usar instâncias do manipulador de eventos genérico

CA1007: Usar genéricos quando apropriado

Confira também

Genéricos