형식 매개변수에 대한 제약조건
제네릭 클래스를 만들 때 형식 매개변수에 제약조건을 줄 수 있습니다. 클래스를 선언할 때 where 키워드를 사용하여 T가 구조체인지 클래스인지를 결정할 수 있습니다.
이번에는 형식 매개변수에 대한 제약조건을 사용해 보겠습니다. 다음 내용을 C# 인터렉티브에서 단계별로 실행해 보세요. 프로젝트 기반 소스는 TypeConstraint.cs 파일에 있습니다.
1. where와 struct 키워드로 형식 매개변수 T에 값 형식만 받는 제네릭 클래스를 만들 수 있습니다. 참조 형식이 들어오면 다음과 같이 컴파일 에러가 발생합니다.
> public class CarValue<T> where T : struct { } //값 형식만 > CarValue<int> c = new CarValue<int>(); //struct 성공 > CarValue<string> c = new CarValue<string>(); (1,18): error CS0453: The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'CarValue<T>' (1,35): error CS0453: The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'CarValue<T>'
2. class 제약 조건을 부여하면 참조 형식만 받는 제네릭 클래스를 생성할 수 있습니다. 마찬가지로 값 형식이 들어오면 컴파일 에러가 발생합니다.
> public class CarReference<T> where T : class { } //참조 형식만 > CarReference<string> cs = new CarReference<string>(); //class 성공 > CarReference<decimal> cs = new CarReference<decimal>(); (1,23): error CS0452: The type 'decimal' must be a reference type in order to use it as parameter 'T' in the generic type or method 'CarReference<T>' (1,45): error CS0452: The type 'decimal' must be a reference type in order to use it as parameter 'T' in the generic type or method 'CarReference<T>'