C# 4.0의 공변 클래스 생략: 자세히 살펴보기
C# 4.0에는 인터페이스에 대한 일반 변형이 도입되어 유연한 유형 매개변수 사용이 가능해졌습니다. 그러나 이 기능은 클래스로 확장되지 않았습니다. 이 기사에서는 이러한 디자인 선택의 근거를 자세히 설명합니다.
구현의 장애물
클래스(예: 가상 C<T>
클래스)에 공변량을 도입하면 상당한 구현 문제가 발생합니다. 주요 제한은 T
이 출력 매개변수, setter 또는 필드로만 사용될 수 있다는 사실에서 발생합니다.
이 제약은 getter가 없는 필드의 직접적인 결과입니다. 속성과 달리 필드는 읽기 전용 액세스를 제공하지 않습니다. 따라서 공변 클래스는 변경 가능한 상태를 가질 수 없어 실제 적용이 심각하게 제한됩니다.
비용과 이점 비교
공변 불변 클래스(예: 목록 및 스택)는 부인할 수 없는 이점이 있지만 이를 지원하는 데 필요한 C# 유형 시스템에 대한 광범위한 수정은 C# 4.0 릴리스 당시 타당하다고 간주되지 않았습니다.
불변 구조의 공분산 설명
다음 예는 불변 스택의 공분산을 보여줍니다.
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
공변 할당이 가능합니다.
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
스택의 불변성으로 인해 스택에 정수를 추가해도 형식이 안전하게 유지됩니다. 작업이 유형 안전을 위반하지 않습니다.
위 내용은 C# 4.0에서 공변 클래스가 지원되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!