제네릭

공변성, 반공변성, 무공변성의 세가지 용어가 있다.

변성에 대한 내용은 인터페이스와 델리게이트에만 적용되는 내용이며 클래스와 구조체는 만들 수 없다.

타입 매개변수별로 각각의 변성을 지정하기 위해 in, out 한정자를 사용한다.

// 공변환 가능
public interface IEnumerable<out T>
// 반공변환 가능
public delegate void Action<in T>
// 타입 매개변수는 변환되지 않음
public interface IList<T>

<aside> 💡 인자타입은 최대한 추상적으로 반환타입은 최대한 구체적으로

</aside>

C#을 다루는 기술 127p 인용

C# 언어의 공변성과 반공변성