제네릭 형식 매개 변수의 경우 키워드를 in 사용하여 반공변 형식 인수를 허용합니다.
in 제네릭 인터페이스 및 대리자에서 키워드를 사용합니다.
C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.
설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.
팁 (조언)
C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.
반공변을 사용하면 제네릭 매개 변수로 지정된 형식보다 덜 파생된 형식을 사용할 수 있습니다. 이 기능을 사용하면 반공변 인터페이스를 구현하는 클래스를 암시적으로 변환하고 대리자 형식을 암시적으로 변환할 수 있습니다. 참조 형식은 제네릭 형식 매개 변수에서 공변성 및 반공변을 지원하지만 값 형식은 이러한 기능을 지원하지 않습니다.
메서드의 반환 형식이 아닌 메서드 매개 변수의 형식을 정의하는 경우에만 제네릭 인터페이스 또는 대리자에서 형식을 반공변으로 선언할 수 있습니다.
In, ref및 out 매개 변수는 고정되어야 합니다. 즉, 공변성 또는 반공변성이 아닙니다.
반공변 형식 매개 변수가 있는 인터페이스를 사용하면 해당 메서드가 인터페이스 형식 매개 변수에 지정된 것보다 덜 파생된 형식의 인수를 수락할 수 있습니다. 예를 들어 인터페이스에서 IComparer<T> T 형식은 반공변입니다. 상속하는 IComparer<Person> 경우 Employee 특수 변환 메서드를 사용하지 않고 형식의 개체를 형식의 IComparer<Employee> 개체에 할당할 수 있습니다Person.
동일한 형식의 다른 대리자에게 반공변 대리자를 할당할 수 있지만 파생된 제네릭 형식 매개 변수가 적습니다.
자세한 내용은 공변성 및 반공변성(Contravariance)을 참조하세요.
반공변 제네릭 인터페이스
다음 예제에서는 반공변 제네릭 인터페이스를 선언, 확장 및 구현하는 방법을 보여줍니다. 또한 이 인터페이스를 구현하는 클래스에 암시적 변환을 사용하는 방법도 보여 줍니다.
// Contravariant interface.
interface IContravariant<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
class Program
{
static void Test()
{
IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
}
}
반공변 제네릭 대리자
다음 예제에서는 반공변 제네릭 대리자를 선언, 인스턴스화 및 호출하는 방법을 보여줍니다. 또한 대리자 형식을 암시적으로 변환하는 방법도 보여줍니다.
// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }
public void Test()
{
// Instantiating the delegates with the methods.
DContravariant<Control> dControl = SampleControl;
DContravariant<Button> dButton = SampleButton;
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
// Invoke the delegate.
dButton(new Button());
}
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.
참고하십시오
.NET