Compartir a través de


CA1004: Los métodos genéricos deben proporcionar un parámetro de tipo

Nombre de tipo

GenericMethodsShouldProvideTypeParameter

Identificador de comprobación

CA1004

Categoría

Microsoft.Design

Cambio problemático

Causa

La firma del parámetro de un método genérico visible externamente no contiene tipos que corresponden a todos los parámetros type del método.

Descripción de la regla

La inferencia es el modo en que se determina el argumento de tipo de un método genérico partiendo del tipo de argumento pasado al método, en lugar de especificar directamente el argumento de tipo. Para habilitar la inferencia, la firma de parámetro de un método genérico debe incluir un parámetro del mismo tipo que el parámetro type del método. En este caso, no es necesario especificar el argumento de tipo. Cuando utiliza la inferencia para todos los parámetros de tipo, la sintaxis para llamar a los métodos de instancia genéricos y no genéricos es la misma. Así se simplifica el uso de los métodos genéricos.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el diseño de modo que la firma del parámetro contenga el mismo tipo para cada uno de los parámetros de tipo del método.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla. Al proporcionar genéricos con una sintaxis fácil de entender y utilizar se reduce el tiempo necesario de aprendizaje y se aumenta la velocidad de adopción de nuevas bibliotecas.

Ejemplo

El ejemplo siguiente muestra la sintaxis para llamar a dos métodos genéricos. El argumento de tipo de InferredTypeArgument se infiere, y el argumento de tipo de NotInferredTypeArgument se debe especificar de manera explícita.

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);
      }
   }
}

Reglas relacionadas

CA1005: Evite parámetros excesivos en tipos genéricos

CA1010: Las colecciones deben implementar la interfaz genérica

CA1000: No declarar miembros estáticos en tipos genéricos

CA1002: No exponer listas genéricas

CA1006: No anidar tipos genéricos en firmas de miembro

CA1003: Utilizar instancias genéricas de controlador de eventos

CA1007: Utilizar valores genéricos cuando sea posible

Vea también

Referencia

Genéricos (Guía de programación de C#)