Partilhar via


CA1004: os métodos genéricos devem fornecer o parâmetro de tipo

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

A assinatura de um método genérico externamente visível não contém tipos que correspondem aos parâmetros de tipo do método.

Descrição da Regra

A inferência é como o argumento de tipo de um método genérico é determinado pelo tipo de argumento transmitido ao método, em vez pela especificação explícita do 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 do tipo não precisa ser especificado.Quando você usa a inferência para todos os parâmetros de tipo, a sintaxe para chamar métodos genéricos e não da instância é idêntica.Isso simplifica a utilidade de métodos genéricos.

Como Corrigir Violações

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

Quando Suprimir Alertas

Não elimine um alerta desta regra.Fornecer produtos genéricas em uma sintaxe que seja fácil de entender e em uso reduz o tempo necessário para conhecer 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 explicitamente especificado.

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 parâmetros excessivos em tipos genéricos

CA1010: as coleções devem implementar a 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éricos

CA1007: usar genéricos quando apropriado

Consulte também

Referência

Genéricos (Guia de Programação em C#)