IT TIP

C # 4.0에서 클래스에 대한 일반 분산이없는 이유는 무엇입니까?

itqueen 2021. 1. 6. 20:36
반응형

C # 4.0에서 클래스에 대한 일반 분산이없는 이유는 무엇입니까?


인터페이스 용이 있다면 클래스 용으로도 사용하지 않는 이유는 무엇입니까? 그것을 사용할 때 우리가 겪게 될 문제는 무엇입니까?


C<T>T에서 공변 인 클래스 있다고 가정합니다. 그 구현은 어떻게 생겼을까 요? T는 밖에 나가야합니다. , 필드는 속성 setter와 논리적으로 동일하기 때문에 T , C<T>setter가있는 T 유형의 속성 또는 T 유형의 필드를받는 메서드를 가질 수 없습니다 . T가 들어갑니다.

공변 클래스로 빌드 할 수있는 유일한 유용한 것은 T에 관한 한 변경 불가능한 것입니다. 자, 나는 공변 불변 목록과 스택을 갖는 것이 멋질 것이라고 생각합니다. 그러나 그 기능은 형 시스템이 기본적으로 공변 불변 클래스 유형을 지원하도록 만드는 데 막대한 지출을 정당화 할만큼 명백히 대단하지 않습니다.

위의 의견은 이것이 유용한 곳의 예를 요청했습니다. 다음 스케치를 고려하십시오.

sealed class Stack<out T>
{
    private readonly T head;
    private readonly Stack<T> tail;
    public T Peek() { return head; }
    public Stack<T> Pop() { return tail; }
    public Stack(T head, Stack<T> tail)
    {
        this.tail = tail;
        this.head = head;
    }
}
static class StackExtensions
{
    public static Stack<T> Push<T>(this Stack<T> tail, T head) 
    {
        return new Stack<T>(head, tail);
    }
    public static bool IsEmpty<T>(this Stack<T> stack)
    {
        return stack == null;
    }
}

공변 클래스가 있다고 가정하십시오. 이제 말할 수 있습니다

Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings;
objects = objects.Push(123);

그리고 우리는 정수를 문자열 스택에 넣었지만 모든 것이 잘되었습니다! 이것이 형식 안전이 될 수없는 이유가 없습니다. 변경 가능한 데이터 구조에서 유형 안전성을 위반하는 작업은 변경 불가능한 데이터 구조에서 안전하게 공변 할 수 있습니다.


C # 및 VB.NET 팀과 함께 .NET 팀은 제한된 리소스를 가지고 있으며 공 변성 및 반공 변성에 대해 수행 한 작업은 대부분의 실제 문제를 해결 합니다. 유형 시스템은 제대로 작동하기가 매우 복잡합니다. 99.9999 %의 경우에서 작동하는 솔루션은 다른 경우에서 안전하지 않은 코드로 이어질 경우 충분하지 않습니다.

클래스 메서드에 대한 공분산 및 반공 변성 사양 (예 : "in"/ "out")을 지원하는 데 드는 비용 / 시간이 충분히 가치가 있다고 생각하지 않습니다. 다중 클래스 상속이 없기 때문에 사용할 수있는 경우를 거의 볼 수 없습니다.

이 지원을 받기 위해 .net을 위해 6 개월을 더 기다렸습니까?


이것을 생각하는 또 다른 방법은 .net에서

  • 인터페이스 / 대리자 – 애플리케이션 개념적 유형 시스템 을 모델링하는 데 사용됩니다.
  • 클래스위의 유형 구현 하는 데 사용됩니다.
  • 클래스 상속 은 위의 작업을 수행하는 동안 코드 중복을 줄이는 데 사용됩니다.
  • 공 변성 및 반반 변성응용 프로그램 개념적 유형 시스템 에 관한 것입니다.

이 msdn 게시물 확인 : 제네릭 형식의 변형 (C # 프로그래밍 가이드)

참조 URL : https://stackoverflow.com/questions/2733346/why-isnt-there-generic-variance-for-classes-in-c-sharp-4-0

반응형