C#일반 구속조건

3265 단어 C#
본고는 각종 범주형 제약에 대해 간단한 총결을 할 것이다.
글은 처음에 프레젠테이션 코드의 원고를 제시했다(이 기초 위에서 수정, 프레젠테이션, 설명).
class MyList 
{
    List list = new List();
    public T this[int i]
    {
        get { return list[i]; }
        set { this.list[i] = value; }
    }
}

class Person
{
    public string Name { get; set; }
}

다음은 순서대로 프레젠테이션 코드 원고를 수정하여 서로 다른 유형의 범용 제약을 설명한다.
 
1 일반 매개변수를 값 유형으로 지정
class MyList where T:struct
{
...      
}

구속을 적용한 후의 효과를 살펴보고 MyList 클래스를 다음과 같이 인스턴스화합니다.
MyList list = new MyList();

다음과 같은 오류 메시지가 나타납니다.
유형 "GencConstraint.Person"은 null이 될 수 없는 값 유형이어야 일반 유형 또는 방법인 "GencConstraint.MyList"의 매개변수 "T"로 사용할 수 있습니다.
MyList 클래스를 다음과 같이 인스턴스화하여 모든 작업을 정상적으로 수행합니다.
 MyList list = new MyList();

 
2 인용 형식으로 일반 매개 변수 지정하기
class MyList where T:class 
{
...       
} 

일반 구속조건을 참조 유형으로 수정하면 Person 클래스가 참조 유형이므로 일반 구속조건을 충족하는 오류 프롬프트가 사라집니다.
 
3 범용 매개 변수의 공통된 구조 함수를 지정한다
class MyList where T:new()
{
...      
}

Person 클래스에 대해 다음과 같은 코드를 사용하여 비공개 참조 함수를 추가합니다.
class Person
{
    public string Name { get; set; }
    private Person()
    { 
        //do nothing
    }
}

MyList 클래스 인스턴스화:
MyList list = new MyList();

컴파일 오류가 발생했습니다. 프롬프트:
'GencConstraint.Person'은 공통적으로 파라미터가 없는 구조 함수를 가진 비추상적인 유형이어야 범용 유형이나 방법인'GencConstraint.MyList'의 파라미터'T'로 사용할 수 있다.
하하, 구속이 작용했어.
 
4 지정한 일반 매개 변수는 지정한 기본 클래스에 파생되어야 합니다
추상 클래스 SeniorAnimal 추가
abstract class SeniorAnimal//    
{
    public abstract void Speak();//   
    public abstract void UseTool();//     
}

지정 범용 매개변수는 기본 클래스 SeniorAnimal에서 파생되어야 합니다.
class MyList where T : SeniorAnimal
{
     ...      
}

MyList 클래스를 인스턴스화합니다. 이때 Person 클래스는 SeniorAnimal 클래스에서 상속되지 않았습니다.
MyList list = new MyList();

컴파일 오류가 발생했습니다. 프롬프트:
유형'GencConstraint.Person'을 일반 유형 또는 방법인'GencConstraint.MyList'의 유형 매개 변수'T'로 사용할 수 없습니다.'GencConstraint.Person'에서'GencConstraint.SeniorAnimal'로 은밀한 참조 변환이 없습니다.
Person 클래스가 SeniorAnimal 클래스에서 상속되도록 코드 수정
class Person : SeniorAnimal
{
    public string Name { get; set; }

    public override void Speak()
    {
        Console.WriteLine("     !");
    }

    public override void UseTool()
    {
        Console.WriteLine("     !");
    }
}

다시 편역하면 모든 것이 정상이다.
 
5 지정된 일반 매개 변수는 지정된 인터페이스를 실현해야 한다
프레젠테이션 상황은 4점과 유사하여 프레젠테이션 코드를 제공하지 않습니다.
 
6 일반 매개변수는 일반 유형 U에 파생되어야 합니다. (raw 유형 구속조건)
class MyList where U : SeniorAnimal
{
    List list = new List();
    public void ShowInfo() where T : U
    {
    }
}

 
 
또한 같은 범용 매개 변수에 여러 개의 제약을 적용할 수 있다.
 
좋아, 게임 오버!
 

좋은 웹페이지 즐겨찾기