당신 은 C\#의 협 변 과 역 변 을 알 고 있 습 니까?이 편 을 보고 알 게 되 었 습 니 다.

C\#4.0 부터 범 형 인터페이스 와 범 형 의뢰 는 모두 협 변 과 역 변 을 지원 하고 역사적 인 이유 로 배열 도 협 변 을 지원 한다.
리 씨 교체 원칙:어떤 기류 가 나타 날 수 있 는 곳 이 든 자 류 는 반드시 나타 날 수 있다.
협 변(out)
  • 협 변:즉,자 연 스 러 운 변화 이다.리 씨 교체 원칙 에 따라 코드 에 나타 나 면 모든 기본 클래스 가 하위 클래스 에 의 해 부 여 될 수 있다.예 를 들 어 Animal=Dog,Animal=Cat
  • out 키워드 성명 사용(주의 와 방법 에서 매개 변 수 를 수식 하 는 out 의 의미 가 다 릅 니 다)
  • 표 시 된 매개 변수 유형 은 방법의 반환 값(읽 기 전용 속성 포함)으로 만 사용 할 수 있 습 니 다
  • 4.567917.협 변 이 없 을 때:4.567918.
    
    abstract class Animal {}
    class Dog : Animal {}
    class Cat : Animal {}
    
    interface IPoppable<T>
    {
      T Pop();
    }
    class MyStack<T> : IPoppable<T>
    {
      private int _pos;
      private readonly T[] _data = new T[100];
    
      public void Push(T obj) => _data[_pos++] = obj;
      public T Pop() => _data[--_pos];
    }
    
    
    다음 코드 는 컴 파일 을 통과 할 수 없습니다.
    
    var dogs = new MyStack<Dog>();
    IPoppable<Animal> animals1 = dogs; //          
    Stack<Animal> animals2 = dogs; //          
    
    이때,우리 가 동물원 사육 사 에 게 Stack사육 방법 으로 입력 인 자 를 추가 해 야 한다 면,비교적 좋 은 방법 은 제약 범 형 방법 을 추가 하 는 것 이다.
    
    class Zookeeper
    {
      public static void Feed<T>(IPoppable<T> animals) where T : Animal {}
    }
    //   
    class Zookeeper
    {
      public static void Feed<T>(Stack<T> animals) where T : Animal {}
    }
    
    // Main
    Zookeeper.Feed(dogs);
    
    
    지금 C\#협 변 이 증가 하 였 습 니 다.
    IPoppable인터페이스 에 협 변 을 지원 합 니 다.
    
    //         out   
    interface IPoppable<out T>
    {
      T Pop();
    }
    
    Feed 방법 간소화
    
    class Zookeeper
    {
      public static void Feed(IPoppable<Animal> animals) {}
    }
    
    // Main
    Zookeeper.Feed(dogs);
    
    
    협 변 의 천연 적 특성―방법 으로 만 값 을 되 돌 릴 수 있 고 인터페이스(또는 위탁)외부 에 서 는 요 소 를 추가 할 수 없 으 며 범 형 안전성 을 확보 하기 때문에 Dog 의 집합 에 Cat 가 나타 날 염려 는 없다.
    협 변 을 지원 하 는 인터페이스 와 의뢰 는 다음 과 같 습 니 다.
  • IEnumerable
  • IEnumerator
  • IQueryable
  • IGrouping
  • Func 등 총 17 개
  • Converter
  • 
    IEnumerable<Dog> dogs = Enumerable.Empty<Dog>();
    IEnumerable<Animal> animals = dogs;
    
    var dogList = new List<Dog>();
    IEnumerable<Animal> animals = dogList;
    
    
    또한 역사적 인 원인 으로 인해 배열 도 협 변 을 지원 한다.예 를 들 어
    
    var dogs = new Dog[10];
    Animal[] animals = dogs;
    
    그러나 유형 안전성 을 보장 할 수 없습니다.아래 코드 는 정상적으로 컴 파일 할 수 있 지만 실행 시 오류 가 발생 할 수 있 습 니 다.
    
    animals[0] = new Cat(); //       
    
    역 변(in)
    4.567917.역 변:즉,협 변 의 역방향 변 화 는 실질 적 으로 리 씨 교체 의 원칙 에 따라 자 류 를 기본 류 에 할당 하 는 것 이다
  • in 키워드 성명 사용
  • 표 시 된 매개 변수 유형 은 방법 으로 만 매개 변 수 를 입력 할 수 있 습 니 다(속성 만 포함)
  • 4.567917.예 를 들 어 4.567918.
    
    abstract class Animal {}
    class Dog : Animal {}
    class Cat : Animal {}
    
    interface IPushable<in T>
    {
      void Push(T obj);
    }
    class MyStack<T> : IPushable<T>
    {
      private int _pos;
      private readonly T[] _data = new T[100];
    
      public void Push(T obj) => _data[_pos++] = obj;
      public T Pop() => _data[--_pos];
    }
    
    // Main
    var animals = new MyStack<Animal>();
    animals.Push(new Cat());
    IPushable<Dog> dogs = animals;
    dogs.Push(new Dog());
    
    
    역 변 의 천연 특성―방법 으로 만 파 라 메 터 를 입력 할 수 있 고 인터페이스(또는 의뢰)는 요 소 를 얻 을 수 없다.즉,하위 클래스 를 부모 클래스 에 만 할당 하여 유형 안전성 을 확보 할 수 있다.
    또한 역 변 을 지원 하 는 인터페이스 와 의뢰 는 다음 과 같다.
  • IComparer
  • IComparable
  • IEqualityComparer
  • 액 션 등 총 16 개
  • Predicate
  • Comparison
  • Converter
  • 
    Action<Animal> animalAction = new Action<Animal>(a => { });
    Action<Dog> DogAction = animalAction;
    
    C\#의 협 변 과 역 변 에 대해 알 고 계 십 니까?이 글 을 읽 고 알 게 된 글 을 여기까지 소개 하 겠 습 니 다.더 많은 관련 C\#협 변 역 변 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기