C#에서 공분산 및 비조화에 대한 새로운 키워드가 필요한 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/268836

문제

누군가가 일반 유형이 C# 4.0의 CO 또는 Contra 변형임을 나타 내기 위해 아웃 또는 매개 변수를 추가 해야하는 이유를 설명 할 수 있습니까?

나는 이것이 왜 중요한지, 왜 컴파일러가 그것을 알아낼 수 없는지 이해하려고 노력했습니다.

감사,

조롱

도움이 되었습니까?

해결책

Langauge에서 일하는 Eric Lippert는 MSDN에 관련된 일련의 게시물을 가지고있어 관련 문제를 명확히해야합니다.
http://blogs.msdn.com/ericlippert/archive/tags/covariance+and+contravariance/default.aspx

해당 링크에 표시된 기사를 읽을 때 맨 아래에서 시작하여 작업하십시오.

결국 당신은 얻을 수 있습니다 #7 (왜 우리는 구문이 전혀 필요합니까?).

다른 팁

우리는 실제로 그렇지 않습니다 필요 그들, 더 이상 우리는 필요합니다 abstract 수업 또는 둘 다 out 그리고 ref. 그들은 프로그래머로서 우리의 의도를 명확하게 만들 수 있도록 유지 보수 프로그래머가 우리가하고있는 일을 알고 컴파일러가 우리가 올바르게하고 있는지 확인할 수 있도록 존재합니다.

글쎄, 주요 문제는 다음과 같은 클래스 계층 구조가 있다면 다음과 같은 것입니다.

   class Foo { .. } 

   class Bar : Foo { .. } 

그리고 당신은 있습니다 IEnumerator<Bar>, 당신은 그것을 an으로 사용할 수 없습니다 IEnumerator<Foo> 비록 그것이 완벽하게 안전 할 것입니다. 3.5에서 이것은 많은 고통스러운 회전을 강요합니다. 이 작업은 항상 안전하지만 일반 유형 매개 변수의 공분산 사용에 대해 알지 못하기 때문에 유형 시스템에 의해 거부됩니다. IEnumerator<Bar> a Bar 그리고 모든 Bar a Foo.

마찬가지로, 당신이 있었다면 IEqualityComparer<Foo> 유형의 객체를 비교하는 데 사용할 수 있습니다. Foo 하나 또는 둘 다가 a Bar, 그러나 그것은 캐스트 될 수 없습니다 IEqualityComparer<Bar> 일반적인 유형 매개 변수의 비밀스러운 사용에 대해 알지 못하기 때문입니다. IEqualityComparer<Foo> 유형의 객체 만 소비합니다 Foo 그리고 모든 Bar a Foo.

이러한 키워드가 없으면 우리는 일반적인 인수가 방법에 대한 인수와 결과 유형의 메소드 유형으로 발생할 수 있으므로 위의 전환 중 하나를 안전하게 허용 할 수 없습니다.

그들과 함께, 유형 시스템은 키워드로 표시된 방향으로 해당 인터페이스 사이를 안전하게 업 캐스트하고 다운 캐스트 할 수 있으며 안전을 보장하는 데 필요한 분야를 위반할시기를 나타내는 오류가 발생할 수 있습니다.

그만큼 in 그리고 out 키워드는 C# 1.0 이후 키워드이며 in- 그리고 out- 메소드에 매개 변수.

공분산과 비밀화는 인터페이스를 구현할 수있는 방법에 대한 제약입니다. 그들을 추론하는 좋은 방법은 없습니다. 유일한 방법은 사용에 대한 것이며, 그것은 지저분하고 결국 작동하지 않을 것입니다.

Jon과 Joel은 모두 이것에 대한 아주 완전한 답을 제공했지만 결론은별로 그렇지 않다는 것입니다. 필요합니다 컴파일러는 파라미터의 분산을 명시 적으로 표시하여 구현의 안전을 보장하는 데 도움이됩니다. 이것은 필요와 매우 유사한 패턴을 따릅니다 out 또는 ref 전화 사이트와 선언 사이트의 키워드.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top