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

Consulte também

Referência

Generics (C# Programming Guide)