where 절은 제네릭 선언에서 정의된 타입 매개변수의 변수로 사용할 수 있는 타입 제약 조건을 지정하는 데 사용됩니다. 1. 인터페이스 제약 조건. 예를 들어, 제네릭 클래스 MyGenericClass를 선언하면 타입 매개변수 T가 IComparable 인터페이스를 구현할 수 있습니다<T>:
공개 클래스 MyGenericClass<T> 중 T:IComparable { }
2. 기본 클래스 제약: 타입이 지정된 클래스를 기본 클래스(또는 클래스 자체)로 사용하여 해당 제네릭 타입의 타입 매개변수로 사용해야 함을 나타낸다. 이러한 제약 조건이 사용되면, 해당 매개변수 유형에 대한 다른 모든 제약 조건보다 먼저 나타나야 합니다. 클래스 MyClassy<T, U> 여기서 T : 클래스 여기서 U : struct
{
}
3.where절은 생성자 제약도 포함할 수 있습니다. 새로운 연산자를 사용해 타입 매개변수의 인스턴스를 생성할 수 있습니다; 하지만 타입 인자는 이 경우에 대해 constructor constraint new()에 의해 제약되어야 합니다. new() 제약 조건은 컴파일러에게 제공되는 모든 유형의 인자가 접근 가능한 매개변수 없는(또는 기본값) 생성자를 가져야 함을 알려줍니다. 예를 들어: 공개 클래스 MyGenericClass <T> 에서 T: IComparable, new()
{ 다음 줄은 new() 제약 조건 없이는 불가능합니다: T 항목 = 새로운 T();
} new() 제약은 where절 끝에 나타납니다.
4. 여러 타입 매개변수의 경우, 각 타입 매개변수는 여기서 절을 사용합니다. 예를 들어: 인터페이스 MyI { } 클래스 사전<TKey,TVal> 여기서 TKey: IComparable, IEnumerable 여기서 TVal: MyI
{ 공공 공허 Add(TKey key, TVal val)
{
}
}
5. 제네릭 메서드의 타입 매개변수에 제약 조건을 부착할 수도 있습니다. 예를 들면:
public bool MyMethod<T>(T t) where T : IMyInterface { }
타입 매개변수 제약 조건을 설명하는 문법은 위임자와 메서드 모두에서 동일하다는 점에 유의하세요:
대의원 T MyDelegate<T>() 여기서 T : new()
일반 어디
Generic 여기서 유형 매개변수를 자격화할 수 있습니다. 여러 가지 방법이 있습니다.
·여기서 T : struct는 T가 System.ValueType으로부터 상속받아야 할 타입 매개변수를 제한합니다.
·여기서 T: 클래스는 타입을 제한합니다. 매개변수 T는 참조 타입이어야 하며, System.ValueType에서 상속될 수 없습니다.
여기서 T : new()는 타입 매개변수를 제한한다. T는 기본 구성자를 가져야 한다.
·여기서 T : NameOfClass는 T가 클래스로부터 상속받거나 인터페이스를 구현해야 하는 타입 매개변수를 제한합니다.
이 수식자들은 결합할 수 있습니다. 예를 들어: public class Point (여기서 T : class), IComparable, new() |