형식 매개 변수 제약 조건

클라이언트 코드에 나타날 수있는 모든 매개 변수 유형, 원하는 조작 또는 메소드 호출을 지원해야합니다 : 그것은 합법적인지 여부가 다른 요소와 비교 될 수 있는지 여부를 결정하기 위해, 요소의 테이블을 확인하려면, 다음 컴파일러가 있는지 확인해야합니다. 이 얻을 하나 개 이상의 제약을 적용, 일반 클래스의 정의에 의해 보장된다. 제약 조건의 종류는 컴파일러, 형식 파라미터로 사용될 수있는 객체 또는이 유형으로부터 유도 객체의 유형이 통지, 기본 클래스의 제한이다. 컴파일러는 이러한 보증을 제공 후에는 일반 클래스에서이 유형의 메소드를 호출 할 수있다. 문맥 키워드 곳 구현 제약. 다음의 예는 코드베이스 클래스 제약의 애플리케이션 증가 기능으로 myList <T> 클래스를 도시

공용  클래스 사원 
{ 
 공용  클래스 사원 
    { 
        개인  문자열 이름;
        개인  INT의 ID;
        공공 직원 ( 문자열 s의 값 int i)를 
        { 
            이름 = S; 
            이드 = I를; 
        } 
 
        공공  문자열 이름 
        { 
            GET { 반환 이름; }
             집합 {NAME = 값; } 
        } 
        공공  INT의 ID
        { 
            얻을 { 반환 ID를; }
             집합 {식 값; } 
        } 
 
    } 
} 
클래스 myList에 <T> 여기서 T : 직원이 
{ 
 // 이전과 클래스의 나머지. 
  공용 T FindFirstOccurrence ( 문자열 들) 
  { 
   T t = ; 
   초기화(); 
   동안 (HasItems는 ()는) 
   { 
      경우 (! 현재 = null이 )가 
      { 
// : 제약 조건이 할 수 
         있는 경우 (current.Data.Name를 ==  들)
         {
            t = current.Data;
            휴식 ; 
         } 
         다른 
         { 
            전류 = current.Next; 
         } 
      } // 끝 경우 
   } // 끝 동안 
  반환 t; 
  } 
}

제약은 제네릭 클래스 형 T의 모든 요소 때문에, 직원 객체 또는 직원의 승계에서 객체이며, Employee.Name 속성을 사용할 수있다.

 

매개 변수의 동일한 유형의 여러 제약 조건을 적용 할 수 있습니다. 다음과 같이 제약, 제네릭 클래스 자체가있을 수 있습니다 :

클래스 myList에 <T> 여기서 T : 직원, IEmployee,에서 IComparable <T>,   새로운 () 
{...}

 

    다음 표 제약의 다섯 가지 유형 :

강제

기술

여기서 T : 구조체

입력 매개 변수는 값 형식이어야합니다.

여기서 T : 클래스

입력 매개 변수는 참조 형식이어야합니다.

여기서 T : 새로운 ()

입력 매개 변수는 공용 비 인수 생성자가 있어야합니다. 다른 제약 조건과 함께 사용하면, 새로운 () 제약은 마지막에 배치해야합니다.

여기서 T : <기본 클래스 이름>

입력 매개 변수는 그룹 또는 지정된 지정된 기본 형식에서 파생 된 유형이어야합니다.

여기서 T : <인터페이스 이름>

형식 매개 변수는 인터페이스 또는 지정된 지정된 인터페이스를 구현해야합니다. 제약 조건은 여러 인터페이스를 지정할 수 있습니다. 인터페이스 제약은 제네릭이 될 수 있습니다.

                                   

 

동작들 및 방법들의 수를 증가 제약 형 파라미터는 호출 될 수있다. 조작 방법 및 이러한 유형의 지지체의 종류의 유도 계층에 의해 결합된다. 제네릭 클래스 나 메소드를 설계 할 때 따라서, 호출되지 않은 일반 회원이나 방법으로 System.Object의 할당 이외의 작업을하는 경우, 매개 변수 유형에 제약을 사용하는 것이 필요하다.

 

 

사용 유형에 제한없이 일반 매개 변수

이러한 공용 클래스 어떠한 타입 파라미터 제약 MyClass의 <T> {...} 이것은 제한 타입 파라미터 (바운드 유형 파라미터)라고, T이다. 무제한 형식 매개 변수는 다음과 같은 규칙이 있습니다 :

그들은 이러한 연산자를 지원 할 수있는 특정 유형의 매개 변수를 보장 할 수 없기 때문에 1. 연산자를 사용! = ==하지.

그들은과은 System.Object 변환 할 수 있습니다 2.이 될 명시 적 인터페이스 유형을 변환 할 수 있습니다.

3. null로 비교 될 수있다. 이러한 유형의 값 타입 파라미터 무제한으로 널 유형 파라미터 비교, 비교 결과의 합계가 거짓이면.

 

 

제약 조건의 어떤 유형 없습니다

제약이 제네릭 형식 매개 변수가되면, 더 통화 유형 제약 (누드 형 제약)입니다. 때 매개 변수 제약 조건 형식 매개 변수가 어떤 타입이 유용 제약 조건없는 클래스를 만드는 유형 매개 변수 방법의 멤버. 다음 예와 같이

클래스 목록 <T> 
{ 
      // ... 
    무효 추가 <U> (목록 <U> 항목) 여기서 U : T {...} 
}
 

위의 예에서, T의 추가 방법의 상황은, 비 제약 유형 및 클래스 목록 T의 맥락에서, 매개 변수는 무제한의 유형입니다.

 

어떤 유형의 제약도 제네릭 클래스의 정의에 사용할 수 없습니다. 어떤 유형의 제약 조건 및 매개 변수의 특정 다른 유형이 함께 꺽쇠 괄호로 선언되지 않은 있습니다 :

// 알몸 형 제약 
공용  클래스 MyClass에 <T, U, V> 여기서 T : V

컴파일러는 제약 조건의 어떤 유형은 System.Object에서 상속되지 않는다는 생각하기 때문에, 그래서 제약의 어떤 유형이 매우 제한하지 않습니다와 제네릭 클래스를 사용합니다. 당신이 상속 매개 변수의 두 가지 유형을 강제 할 때, 제네릭 클래스의 종류에 제한없이 사용할 수 있습니다.

 

추천

출처www.cnblogs.com/XiaoRuLiang/p/12422207.html