Compartilhar via


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 expõem listas genéricas

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

Consulte também

Referência

Generics (Guia de programação C#)