본문 바로가기

C#

C# 제네릭 클래스 형식 매개변수 제약조건

반응형
  • where 키워드를 사용하여 T가 구조체인지 클래스인지를 결정할 수 있음

T에 값 형식만 받을 수 있도록 제약조건을 사용

public class TTestA<T> where T : struct { }

TTestA<int> a1 = new TTestA<int>(); // 가능
TTestA<string> a2 = new TTestA<string>(); // 컴파일 에러

T에 참조 형식만 받을 수 있도록 제약조건을 사용

public class TTestB<T> where T : class { } // 참조 형식만

TTestB<int> b1 = new TTestB<int>(); // 컴파일 에러
TTestB<string> b2 = new TTestB<string>(); // 가능

매개변수가 없는 생성자만 생성할 수 있도록 제약조건을 사용

public class TTestC<T> where T : new() { } // 파라미터가 없는 생성자
public class TTestC_1 { }
public class TTestC_2 { public TTestC_2(int i) { } }

TTestC<TTestC_1> c1 = new TTestC<TTestC_1>(); // 가능
TTestC<TTestC_2> c2 = new TTestC<TTestC_2>(); // 컴파일 에러

특정 클래스를 제약조건으로 사용하면 해당 클래스와 해당 클래스에서 파생된 클래스 사용가능

 

public class TTestD<T> where T : TTestD_1 { }
public class TTestD_1 { }
public class TTestD_2 : TTestD_1 { }

TTestD<TTestD_1> d1 = new TTestD<TTestD_1>(); // 가능
TTestD<TTestD_2> d2 = new TTestD<TTestD_2>(); // 가능
TTestD<TTestC_1> d3 = new TTestD<TTestC_1>(); // 컴파일 에러
반응형