`in`

in (제네릭 한정자)

제네릭 형식 매개변수에 in 키워드를 쓰면 반공변(contravariant) 형식 인자를 허용하게 돼요. in은 제네릭 인터페이스와 제네릭 대리자(delegate)에서 사용할 수 있습니다.

출처: in (Generic Modifier) - C# Reference

본문

반공변(contravariance) 덕분에 제네릭 매개변수로 지정된 형식보다 덜 파생된(less derived) 형식을 사용할 수 있어요. 이 기능은 반공변 인터페이스를 구현하는 클래스끼리, 그리고 대리자 형식끼리 암시적 변환을 가능하게 합니다. 참조 형식은 제네릭 형식 매개변수에서 공변과 반공변을 모두 지원하지만, 값 형식은 이 기능을 지원하지 않아요.

형식을 반공변으로 선언할 수 있는 경우는 제네릭 인터페이스나 대리자에서 메서드의 매개변수 형식으로 쓰일 때뿐이고, 메서드의 반환 형식으로 쓰일 때는 안 됩니다. 게다가 In, ref, out 매개변수는 공변이나 반공변 모두 아니라 불변(invariant) 이어야 해요.

반공변 형식 매개변수를 가진 인터페이스는 그 메서드가 인터페이스 형식 매개변수로 지정된 형식보다 덜 파생된 형식의 인자를 받아들일 수 있게 해줍니다. 예를 들어 xref:System.Collections.Generic.IComparer`1 인터페이스에서 형식 T는 반공변이에요. 그래서 EmployeePerson을 상속한다면, IComparer<Person> 형식의 객체를 IComparer<Employee> 형식의 객체에 별도의 특별한 변환 메서드 없이 할당할 수 있습니다.

반공변 대리자도 같은 형식이면서 더 덜 파생된 형식 매개변수를 가진 다른 대리자에 할당할 수 있어요.

더 자세한 내용은 Covariance and Contravariance 문서를 참고하세요.

반공변 제네릭 인터페이스

다음 예시는 반공변 제네릭 인터페이스를 선언·확장·구현하는 방법을 보여줍니다. 이 인터페이스를 구현하는 클래스에 암시적 변환을 적용하는 방법도 함께 확인할 수 있어요.

// ./snippets/variance.cs id="1" — 반공변 제네릭 인터페이스 선언·확장·구현 예제

반공변 제네릭 대리자

다음 예시는 반공변 제네릭 대리자를 선언·인스턴스화·호출하는 방법을 보여줍니다. 대리자 형식을 암시적으로 변환하는 방법도 함께 보여줍니다.

// ./snippets/variance.cs id="2" — 반공변 제네릭 대리자 선언·인스턴스화·호출 예제

C# 언어 사양

자세한 사항은 C# 언어 사양을 참고하세요.

더 알아보기