다음을 통해 공유


정적 멤버를 제네릭 형식으로 선언하지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotDeclareStaticMembersOnGenericTypes

CheckId

CA1000

범주

Microsoft.Design

변경 수준

주요 변경

원인

외부에서 볼 수 있는 제네릭 형식에 static(Visual Basic의 경우 Shared) 멤버가 포함되어 있습니다.

규칙 설명

제네릭 형식의 static 멤버를 호출할 때는 형식에 형식 인수를 지정해야 합니다. 유추를 지원하지 않는 제네릭 인스턴스 멤버를 호출할 때는 멤버에 형식 인수를 지정해야 합니다. 다음 호출에서 볼 수 있듯이 이들 두 경우에서 형식 인수를 지정하기 위한 구문은 서로 다르며 혼동하기 쉽습니다.

' Shared method in a generic type.
GenericType(Of Integer).SharedMethod()

' Generic instance method that does not support inference.
someObject.GenericMethod(Of Integer)()
// Static method in a generic type.
GenericType<int>.StaticMethod();

// Generic instance method that does not support inference.
someObject.GenericMethod<int>();

일반적으로 앞의 두 선언은 피해야 합니다. 즉, 멤버를 호출할 때 형식 인수를 지정할 필요가 없도록 해야 합니다. 이렇게 하면 제네릭의 멤버를 호출하는 구문이 제네릭이 아닌 멤버를 호출하는 구문과 차이가 없게 됩니다. 자세한 내용은 제네릭 메서드는 형식 매개 변수를 제공해야 합니다.를 참조하십시오.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 정적 멤버를 제거하거나 인스턴스 멤버로 변경합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다. 제네릭을 이해하고 사용하기 쉬운 구문으로 제공하면 학습에 걸리는 시간이 줄어들고 더 많은 사용자가 새로운 라이브러리를 선택하게 됩니다.

예제

다음 예제에서는 이러한 위반 문제를 발생시키는 메서드를 보여 줍니다.

Imports System
Imports System.Runtime.InteropServices

Namespace Samples

    Public NotInheritable Class EnumParser(Of T)

        Private Sub New()
        End Sub

        ' Fires this violation        
        Public Shared Function TryParse(ByVal value As String, <Out()> ByRef result As T) As Boolean

            Try
                result = DirectCast([Enum].Parse(GetType(T), value), T)
                Return True
            Catch ex As ArgumentException
            End Try

            result = Nothing
            Return False

        End Function

    End Class

    Module Program

        Public Sub Main()

            Dim result As DayOfWeek
            ' Must specify type argument            
            If EnumParser(Of DayOfWeek).TryParse("Monday", result) Then
                Console.WriteLine("Conversion Succeeded!")
            End If

        End Sub

    End Module

End Namespace
using System;

namespace Samples
{    
    public static class EnumParser<T>    
    {        // Fires this violation        
        public static bool TryParse(string value, out T result)        
        {            
            try            
            {                
                result = (T)Enum.Parse(typeof(T), value);                
                return true;            
            }            
            catch (ArgumentException)            
            {            
            }
                result = default(T);            
            return false;        
        }    
    }

    static class Program    
    {        
        public static void Main()        
        {            
            DayOfWeek dayOfWeek;            
            // Must specify type argument            
            if (EnumParser<DayOfWeek>.TryParse("Monday", out dayOfWeek))            
            {                
                Console.WriteLine("Conversion Succeeded!");            
            }        
        }    
    }
}

위의 예제의 경우 제네릭 형식에서 정적 멤버를 선언하면 사용자가 형식 인수를 호출할 때 해당 인수를 지정해야 합니다.

다음 예제에서는 형식 매개 변수 T를 클래스에서 메서드로 이동하여 호출 시 컴파일러에서 유추할 수 있도록 하는 방식으로 위의 위반 문제를 해결합니다.

관련 규칙

제네릭 형식에 매개 변수를 너무 많이 사용하지 마십시오.

컬렉션은 제네릭 인터페이스를 구현해야 합니다.

제네릭 목록을 노출하지 마십시오.

멤버 시그니처에 제네릭 형식을 중첩하지 마십시오.

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

제네릭 이벤트 처리기 인스턴스를 사용하십시오.

적합한 제네릭을 사용하십시오.

참고 항목

참조

제네릭(C# 프로그래밍 가이드)