CA1004: универсальные методы должны предоставлять параметр типа

Товар Значение
Идентификатор правила CA1004
Категория Microsoft.Design
Критическое изменение Критическое

Причина

Сигнатура параметра внешнего видимого универсального метода не содержит типов, соответствующих всем параметрам типа метода.

Описание правила

Вывод – это то, как аргумент типа универсального метода определяется по типу аргумента, переданного методу, а не по явному указанию аргумента типа. Чтобы задействовать вывод, сигнатура параметра универсального метода должна включать параметр, тип которого совпадает с параметром типа для метода. В этом случае аргумент типа указывать не обязательно. При использовании вывода для всех параметров типа синтаксис для вызова универсальных и негенерических методов экземпляра идентичен. Это упрощает удобство использования универсальных методов.

Устранение нарушений

Чтобы устранить нарушение этого правила, измените структуру таким образом, чтобы подпись параметра содержала один и тот же тип для каждого параметра типа метода.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует. Предоставление универсальных шаблонов в синтаксисе, который легко понять и использовать, сокращает время, необходимое для изучения, и увеличивает скорость внедрения новых библиотек.

Пример

В следующем примере показан синтаксис для вызова двух универсальных методов. Аргумент типа для InferredTypeArgument вывода, и аргумент типа для NotInferredTypeArgument него должен быть явно указан.

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

CA1005: не используйте слишком много параметров в универсальных типах

CA1010: коллекции должны реализовывать универсальный интерфейс

CA1000: не объявляйте статические элементы в универсальных типах

CA1002: не следует раскрывать универсальные списки

CA1006: не вкладывайте универсальные типы в сигнатуры членов

CA1003: используйте экземпляры обработчика универсальных событий

CA1007: используйте универсальные объекты, если это уместно

См. также

Универсальные шаблоны