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


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

Обновлен: Ноябрь 2007

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

Связанные правила

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

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

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

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

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

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

Используйте универсальные методы, если это уместно

См. также

Ссылки

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