당신 은 C\#의 협 변 과 역 변 을 알 고 있 습 니까?이 편 을 보고 알 게 되 었 습 니 다.
4297 단어 C#협동 하여 변화 하 다역 변
리 씨 교체 원칙:어떤 기류 가 나타 날 수 있 는 곳 이 든 자 류 는 반드시 나타 날 수 있다.
협 변(out)
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<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.역 변:즉,협 변 의 역방향 변 화 는 실질 적 으로 리 씨 교체 의 원칙 에 따라 자 류 를 기본 류 에 할당 하 는 것 이다
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());
역 변 의 천연 특성―방법 으로 만 파 라 메 터 를 입력 할 수 있 고 인터페이스(또는 의뢰)는 요 소 를 얻 을 수 없다.즉,하위 클래스 를 부모 클래스 에 만 할당 하여 유형 안전성 을 확보 할 수 있다.또한 역 변 을 지원 하 는 인터페이스 와 의뢰 는 다음 과 같다.
Action<Animal> animalAction = new Action<Animal>(a => { });
Action<Dog> DogAction = animalAction;
C\#의 협 변 과 역 변 에 대해 알 고 계 십 니까?이 글 을 읽 고 알 게 된 글 을 여기까지 소개 하 겠 습 니 다.더 많은 관련 C\#협 변 역 변 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.