CA1004: 제네릭 메서드는 형식 매개 변수를 제공해야 합니다.

항목
RuleId 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: 적합한 제네릭을 사용하십시오.

참고 항목

제네릭