Condividi tramite


CA1004: I metodi generici devono fornire parametri di tipo

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

CA1004

Category

Microsoft.Design

Breaking Change

Breaking

Causa

La firma di parametro di un metodo generico visibile esternamente non contiene tipi che corrispondono a tutti i parametri di tipo del metodo.

Descrizione della regola

Per inferenza si intende la procedura con cui viene determinato l'argomento di tipo di un metodo generico in base al tipo di argomento passato al metodo, piuttosto che in base alla specifica esplicita dell'argomento di tipo. Per consentire l'inferenza, la firma di parametro di un metodo generico deve includere un parametro dello stesso tipo del parametro di tipo relativo al metodo. In tal caso non è necessario specificare l'argomento di tipo. Quando si utilizza l'inferenza per tutti i parametri di tipo, la sintassi per la chiamata di metodi di istanza generici e non generici è identica. In tal modo l'utilizzabilità dei metodi generici viene semplificata.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare la progettazione in modo che la firma di parametro contenga lo stesso tipo per ciascun parametro di tipo del metodo.

Esclusione di avvisi

Non escludere un avviso da questa regola. La presenza di generics in una sintassi facile da comprendere e utilizzare riduce il tempo necessario all'apprendimento e aumenta la frequenza di adozione di nuove librerie.

Esempio

Nell'esempio riportato di seguito è illustrata la sintassi per chiamare due metodi generici. L'argomento di tipo relativo a InferredTypeArgument viene dedotto, mentre l'argomento di tipo relativo a NotInferredTypeArgument deve essere specificato in maniera esplicita.

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

Regole correlate

CA1005: Evitare un uso eccessivo di parametri nei tipi generici

CA1010: Gli insiemi devono implementare un'interfaccia generica

CA1000: Non dichiarare membri statici su tipi generici

CA1002: Non esporre elenchi generici

CA1006: Non annidare tipi generici nelle firme dei membri

Ca1003: Utilizzare istanze di gestori eventi generici

CA1007: Utilizzare generics dove appropriato

Vedere anche

Riferimenti

Generics (Guida per programmatori C#)