2010-03-29 1 views
18

그 이유는 무엇입니까? 끝내야 만하는 일입니까? 개념적으로 어렵습니까? 불가능한가요?왜 C# (4.0)은 제네릭 클래스 유형에서 공동 및 반공립을 허용하지 않습니까?

확실히 필드 쓰기는 항상 쓰기 때문에 필드 매개 변수를 사용할 수 없습니다. 하지만 그게 답이 될 수는 없지, 그렇지?

이 질문의 이유는 C# 4의 분산 지원에 대한 기사를 작성하고 있으며 위임자와 인터페이스로 제한되는 이유를 설명해야한다고 생각합니다. 증거의 부담을 역으로하기 만하면됩니다.

업데이트 : 에릭이 예를 들어 보았습니다. 이것에 대해

무엇 (즉 의미가 있는지 알고, 아직 :-)하지 않음)

public class Lookup<out T> where T : Animal { 
    public T Find(string name) { 
    Animal a = _cache.FindAnimalByName(name); 
    return a as T; 
    } 
} 

var findReptiles = new Lookup<Reptile>(); 
Lookup<Animal> findAnimals = findReptiles; 

하나 개의 클래스에서 클래스 자체에서 개최되는 캐시 될 수 있음을 가지는 이유. 그리고 다른 종류의 애완 동물도 같은 이름을 지어서는 안됩니다! 나는 CLR을 주장하지는 않겠지 및 C#이 정도의 시간이 필요합니다 :

BTW,이 optional type parameters in C# 5.0 2 업데이트

:-) 날을 제공합니다. 그냥 그게 무슨 일이 있었는지 이해하려고 노력하지 않습니다.

+1

물론 합리적인 예이지만 인터페이스를 사용하여 수행 할 수없는 사항은 표시하지 않았습니다. 그냥 ILookup 인터페이스 을 만들고 Lookup 을 구현하십시오. 인터페이스 분산에 비해 훨씬 더 강력한 이점은 클래스 분산에 대한 시나리오입니까? –

+1

실제로는 없습니다. 게다가 그것은 적은 코드입니다. 증거의 부담을 뒤집어 둡시다. 왜 그것이 지원되지 않는지 우리는 어떻게 설명 할 수 있습니까? 나는 그것을 실제로 구현할 것을 요구하지 않고있다. "그 방법은 항상 그랬다"라고 생각하지 않는다! :-) –

+0

우리는 기능을 구현하지 * 않는 * 것에 대한 정당성을 제공 할 필요가 없습니다. 기능을 구현하지 않는 * 무료 *입니다. 오히려 기능 구현에 대한 정당성을 제시해야합니다. 기능을 통해 Microsoft에 수백만 달러의 비용이 발생하고 고객에게 시간과 비용을 들여야하는 부담이 커질 수 있습니다. –

답변

18

먼저 떨어져, 그것은 CLR에서 지원되지 않습니다.

둘째, 어떻게 작동합니까? 당신이 가지고 있다고 가정하면

class C<out T> 
{ ... how are you planning on using T in here? ... } 

T는 출력 위치에서만 사용할 수 있습니다. 주목할 것입니다, 클래스는 필드에 쓸 수 있기 때문에 T 타입의 필드를 가질 수 없습니다. 클래스는 논리적으로 쓰는 T를 취하는 메소드를 가질 수 없습니다. 이 기능이 있다고 가정 해보십시오 - 어떻게 활용할 수 있습니까?

T 타입의 읽기 전용 필드를 사용할 수 있다면 불변 클래스에 유용 할 것입니다. 그렇게하면 부적절하게 쓰여질 가능성을 크게 줄일 수 있습니다. 그러나 형식 안정적인 방식으로 차이를 허용하는 다른 시나리오를 생각해 내기 란 매우 어렵습니다.

그런 시나리오가 있다면보고 싶습니다. 그것은 언젠가 이것을 CLR에서 구현하려는 시점이 될 것입니다.

업데이트 :이 질문에 대한 자세한 내용은

Why isn't there generic variance for classes in C# 4.0?

를 참조하십시오.

+1

좋은 질문 :) 저는 지난 해 Lang.NET에서 Anders와 Java 컴파일러 괴짜 (미안) 간의 토론을 기억합니다. 이 기능을 요청했습니다. 그는 왜 그가 물었는지 아는 것처럼 보였다. 그러나 나는 기억할 수 없다. 나는 국가가없는 계급을 생각했다.나는 그 질문에서 무엇인가를 만들려고 노력할 것이다. –

+1

이것은 'Tuple '과 같은 불변의 데이터 타입을위한 좋은 기능이지만 CLR을 변경하기에는 충분치 않습니다 .--). –

+3

또 다른 유스 케이스는 T가 유형 안전에만 사용되며 클래스 구현에는 사용되지 않는 팬텀 유형입니다. – porges

8

필자가 아는 한이 기능은 CLR에서 지원되지 않으므로이 기능을 추가하려면 CLR 쪽에서도 상당한 작업이 필요합니다. 인터페이스와 델리게이트에 대한 공동 편차와 반대 편차는 버전 4.0 이전의 CLR에서 실제로 지원 되었기 때문에 구현하기가 비교적 간단했습니다.

는 (클래스는하지만, 확실히 도움이 될 것입니다이 기능을 지원!) 토마스가 말한대로

+0

네 말이 맞아. 차이점은 인터페이스와 델리게이트의 제네릭 형식 매개 변수는 CLR 2.0과 함께 나온 것입니다. C#에서는 없습니다. –

1

허용되는 경우, 생성자가 하나 이상의 T 또는 T 공급 업체를 허용하는 경우 유형 T와 관련하여 공용성이있는 유용한 100 % 유형 안전 (내부 유형 변환 없음) 클래스 또는 구조를 정의 할 수 있습니다. 그들의 생성자가 하나 이상의 T 소비자를 받아들이면 T와 반비례하는 유용한 100 % 형 안전 클래스 또는 구조를 정의 할 수있다. static 팩토리 메소드 (인터페이스의 이름과 비슷한 클래스에서 가능성이 높습니다)를 사용하는 것보다는 "new"를 사용할 수있는 능력을 뛰어 넘는, 인터페이스를 통한 클래스의 많은 장점이 있는지 확신하지 못합니다. 불변 구조가 공분산을 지원하는 사용 사례를 확실히보십시오.

관련 문제