다음을 통해 공유


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

제네릭 메서드는 다음과 같이 형식 매개 변수를 사용하여 선언되는 메서드입니다.

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

다음 코드 예제에서는 형식 인수를 사용하여 int 메서드를 호출하는 한 가지 방법을 보여줍니다.

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

형식 인수를 생략할 수도 있으며 컴파일러에서 유추합니다. 다음 호출 Swap 은 이전 호출과 동일합니다.

Swap(ref a, ref b);

형식 유추에 대한 동일한 규칙이 정적 메서드 및 인스턴스 메서드에 적용됩니다. 컴파일러는 전달한 메서드 인수에 따라 형식 매개 변수를 유추할 수 있습니다. 제약 조건이나 반환 값에서만 형식 매개 변수를 유추할 수 없습니다. 따라서 형식 유추는 매개 변수가 없는 메서드에서 작동하지 않습니다. 형식 유추는 컴파일러가 오버로드된 메서드 서명을 해결하기 전에 컴파일 시간에 발생합니다. 컴파일러는 동일한 이름을 공유하는 모든 제네릭 메서드에 형식 유추 논리를 적용합니다. 오버로드 확인 단계에서 컴파일러는 형식 유추가 성공한 제네릭 메서드만 포함합니다.

제네릭 클래스 내에서 제네릭이 아닌 메서드는 다음과 같이 클래스 수준 형식 매개 변수에 액세스할 수 있습니다.

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}

포함하는 클래스와 동일한 형식 매개 변수를 사용하는 제네릭 메서드를 정의하는 경우 컴파일러는 메서드 범위 내에서 내부 인수가 외부T에 제공된 인수를 숨기므로 경고 T을 생성합니다. 클래스가 인스턴스화될 때 제공된 인수가 아닌 다른 형식 인수를 사용하여 제네릭 클래스 메서드를 유연하게 호출해야 하는 경우 다음 예제와 같이 GenericList2<T> 메서드의 형식 매개 변수에 다른 식별자를 제공하는 것이 좋습니다.

class GenericList<T>
{
    // CS0693.
    void SampleMethod<T>() { }
}

class GenericList2<T>
{
    // No warning.
    void SampleMethod<U>() { }
}

제약 조건을 사용하여 메서드의 형식 매개 변수에 대해 보다 특수화된 작업을 사용하도록 설정합니다. 이제 Swap<T>으로 이름이 변경된 이 버전은 SwapIfGreater<T>를 구현하는 형식 인수로만 IComparable<T>을 사용할 수 있습니다.

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

제네릭 메서드는 여러 형식 매개 변수에 오버로드할 수 있습니다. 예를 들어 다음 메서드는 모두 동일한 클래스에 있을 수 있습니다.

void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

형식 매개 변수를 메서드의 반환 형식으로 사용할 수도 있습니다. 다음 코드 예제에서는 형식 T의 배열을 반환하는 메서드를 보여줍니다.

T[] Swap<T>(T a, T b)
{
    return [b, a];
}

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요.

참고하십시오