> 백엔드 개발 > C++ > 공변성과 반공변성은 C# 인터페이스의 형식 안전성과 유연성을 어떻게 향상합니까?

공변성과 반공변성은 C# 인터페이스의 형식 안전성과 유연성을 어떻게 향상합니까?

Susan Sarandon
풀어 주다: 2025-01-21 15:11:10
원래의
543명이 탐색했습니다.

How Do Covariance and Contravariance Enhance Type Safety and Flexibility in C# Interfaces?

C#의 공변 및 반공변 인터페이스

C#의 공변 및 반공변 인터페이스는 유형 및 해당 상속 계층을 처리할 때 더 큰 유연성을 제공합니다.

공변 인터페이스(T 출력)

공변 인터페이스는 일반 유형 매개변수가 상속 계층 구조에서 더 높은 수준의 유형으로 처리될 수 있도록 지정합니다. interface IBibble<out T>으로 선언된 인터페이스의 경우 인터페이스 참조가 T에서 파생된 유형을 나타내는 것으로 생각할 수 있습니다.

인버터 인터페이스(T)

반공변 인터페이스를 사용하면 일반 유형 매개변수를 상속 계층 구조에서 하위 수준 유형으로 처리할 수 있습니다. 인터페이스를 interface IBibble<in T>으로 정의하면 인터페이스 참조는 T의 기본 유형을 나타내는 유형으로 간주할 수 있습니다.

공분산의 실제 응용

공분산을 사용하면 파생 유형의 컬렉션을 기본 유형의 컬렉션인 것처럼 처리할 수 있습니다. 예를 들어 각각 이름이 있는 동물 목록을 생각해 보세요. 모든 동물에는 이름이 있으므로 안전하게 모든 동물의 이름을 검색할 수 있습니다.

인버터의 실제 응용

반공변성을 사용하면 기본 유형 컬렉션에 파생 유형을 추가할 수 있습니다. 예를 들어, 동물 컬렉션에 액세스할 수 있고 여기에 물고기를 추가해야 하는 경우 모든 물고기는 동물이기 때문에 그렇게 할 수 있습니다. 그러나 컬렉션에 물고기만 포함되어 있다는 보장이 없기 때문에 컬렉션에서 물고기를 가져오려는 시도는 허용되지 않습니다.

입력 및 출력 위치

C# 4.0에서 inout 키워드는 인터페이스를 공변 또는 반공변으로 명시적으로 표시합니다. in은 입력 위치(메서드 매개변수, 쓰기 전용 속성)를 지정하고, out는 출력 위치(메서드 반환 값, 읽기 전용 속성, out 메서드 매개변수)를 나타냅니다.

다음 예에서는 공분산과 반공분산을 보여줍니다.

<code class="language-csharp">interface IBibbleOut<out T> { }
interface IBibbleIn<in T> { }

class Program
{
    static void Main(string[] args)
    {
        var b = GetOutDescendant(); // b只能保存Descendant对象
        var d = GetInBase(); // d可以接收Base和Descendant对象
    }

    static IBibbleOut<Descendant> GetOutDescendant() { return null; }
    static IBibbleIn<Base> GetInBase() { return null; }
}

class Base { }
class Descendant : Base { }</code>
로그인 후 복사

공변성과 반공변성이 없으면 컴파일러는 예제 코드에서 유형 안전성을 보장할 수 없으며 이로 인해 오류가 발생할 수 있습니다.

위 내용은 공변성과 반공변성은 C# 인터페이스의 형식 안전성과 유연성을 어떻게 향상합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿