본문 바로가기

C#

불변성과 가변성(공변성, 반공변성)

728x90
불변성(Invariance)
- X -> Y가 가능하더라도 C<X>는 C<X>로만 사용할 수 있다. 기본적으로 제네릭은 불변이다.
동일 타입만 사용. 상/하위 타입으로 레퍼런스 변환 불가. interface IFoo<T>
IFoo<Dog> a = new Foo<Dog>();
가변성(Variance)
-특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 말한다.
공변성(Covariance)
- 출력/리턴 타입에 T 사용
- Dog보다 상위타입에 assign 가능
- X -> Y가 가능할 때, C<T>가 C<X> -> C<Y>로 가능하다.
interface IFoo<out T>
IFoo<Animal> a= new Foo<Dog>();
반공변성(Contravariance)
- 입력/메서드 파라미터에 T 사용
- Animal보다 하위타입에 assign 가능
- X -> Y가 가능할 때, C<T>가 C<Y> -> C<X>로 가능하다.
interface IFoo<in T>
IFoo<Dog> a = new Foo<Animal>();

공변성(Covaiance)을 지원하는 대표적인 .NET 타입으로 IEnumerable<out T>, IEnumerator<out T>, IQueryable<out T>, Func<out T>등이 있다.
반공변성(Contravariance)을 지원하는 대표적인 .NET 타입으로 IComparer<in T>, IComparable<in T>, IEqualityComparer<in T>, Action<in T>등이 있다.

[출처]
https://sticky32.tistory.com/entry/C-%EA%B3%B5%EB%B3%80%EC%84%B1%EA%B3%BC-%EB%B0%98%EA%B3%B5%EB%B3%80%EC%84%B1%EC%9D%B4%EB%9E%80
http://www.csharpstudy.com/DevNote/Article/31

728x90