Поделиться через


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

TypeName

GenericMethodsShouldProvideTypeParameter

CheckId

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: используйте универсальные методы, если это уместно

См. также

Ссылки

Универсальные шаблоны (Руководство по программированию на C#)