영어로 읽기

다음을 통해 공유


out(제네릭 한정자)(C# 참조)

제네릭 형식 매개 변수의 경우 키워드는 out 형식 매개 변수가 공변성임을 지정합니다. 제네릭 인터페이스 및 대리자 out 에서 키워드를 사용할 수 있습니다.

공변성에서는 제네릭 매개 변수에 지정된 것보다 더 많은 파생 형식을 사용할 수 있습니다. 이렇게 하면 공변 인터페이스를 구현하는 클래스를 암시적으로 변환하고 대리자 형식을 암시적으로 변환할 수 있습니다. 공변성 및 반공변은 참조 형식에 대해 지원되지만 값 형식에는 지원되지 않습니다.

공변 형식 매개 변수가 있는 인터페이스를 사용하면 해당 메서드가 형식 매개 변수로 지정된 형식보다 더 많은 파생 형식을 반환할 수 있습니다. 예를 들어 .NET Framework 4에서 IEnumerable<T>T 형식은 공변이므로 특수 변환 메서드를 사용하지 않고 형식의 개체 IEnumerable(Of String) 를 형식의 IEnumerable(Of Object) 개체에 할당할 수 있습니다.

공변 대리자는 동일한 형식의 다른 대리자를 할당할 수 있지만 더 파생된 제네릭 형식 매개 변수를 사용할 수 있습니다.

자세한 내용은 공변성 및 반공변성(Contravariance)을 참조하세요.

예제 - 공변 제네릭 인터페이스

다음 예제에서는 공변 제네릭 인터페이스를 선언, 확장 및 구현하는 방법을 보여줍니다. 또한 공변 인터페이스를 구현하는 클래스에 암시적 변환을 사용하는 방법을 보여 줍니다.

// Covariant interface.
interface ICovariant<out R> { }

// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }

// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }

class Program
{
    static void Test()
    {
        ICovariant<Object> iobj = new Sample<Object>();
        ICovariant<String> istr = new Sample<String>();

        // You can assign istr to iobj because
        // the ICovariant interface is covariant.
        iobj = istr;
    }
}

제네릭 인터페이스에서 형식 매개 변수는 다음 조건을 충족하는 경우 공변성으로 선언할 수 있습니다.

  • 형식 매개 변수는 인터페이스 메서드의 반환 형식으로만 사용되며 메서드 인수의 형식으로 사용되지 않습니다.

    참고

    이 규칙에는 한 가지 예외가 있습니다. 공변 인터페이스에 반공변 제네릭 대리자가 메서드 매개 변수로 있는 경우 공변 형식을 이 대리자의 제네릭 형식 매개 변수로 사용할 수 있습니다. 공변성 및 반공변 제네릭 대리자에 대한 자세한 내용은 대리자에서의 분산Func 및 작업 제네릭 대리자에서 분산 사용을 참조하세요.

  • 형식 매개 변수는 인터페이스 메서드에 대한 제네릭 제약 조건으로 사용되지 않습니다.

예제 - 공변 제네릭 대리자

다음 예제에서는 공변 제네릭 대리자를 선언, 인스턴스화 및 호출하는 방법을 보여줍니다. 또한 대리자 형식을 암시적으로 변환하는 방법도 보여줍니다.

// Covariant delegate.
public delegate R DCovariant<out R>();

// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }

public static Button SampleButton()
{ return new Button(); }

public void Test()
{
    // Instantiate the delegates with the methods.
    DCovariant<Control> dControl = SampleControl;
    DCovariant<Button> dButton = SampleButton;

    // You can assign dButton to dControl
    // because the DCovariant delegate is covariant.
    dControl = dButton;

    // Invoke the delegate.
    dControl();
}

제네릭 대리자에서 형식이 메서드 반환 형식으로만 사용되고 메서드 인수에 사용되지 않는 경우 공변성으로 선언할 수 있습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.

참고하십시오


추가 리소스

이벤트

.NET 컨퍼스 2025

10월 31일 오후 6시 - 10월 31일 오후 6시

.NET 10이 .NET 컨퍼스 2025에서 출시됩니다! 11월 11일부터 13일까지 .NET 커뮤니티에서 새 릴리스를 축하하고 알아보세요.

날짜 저장