문제

PDC 2008에 참석하지는 않았지만 C# 4.0이 일반 공분산 및 콘트라 분산을 지원하겠다고 발표되었다는 소식을 들었습니다. 그건, List<string> 할당 할 수 있습니다 List<object>. 어떻게 될 수 있습니까?

Jon Skeet의 책에서 C# 깊이, C# Generics가 공분산 및 콘트라 분산을 지원하지 않는 이유가 설명됩니다. 주로 보안 코드를 작성하는 것입니다. 이제 C# 4.0이 지원하도록 변경되었습니다. 혼돈을 가져올까요?

C# 4.0에 대한 세부 사항을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

분산은 a에서만 지원됩니다 안전한 실제로 - 실제로 CLR이 이미 가지고있는 능력을 사용합니다. 그래서 내가 사용하려는 책에서 내가주는 사례는 List<Banana> A로 List<Fruit> (또는 그것이 무엇이든) 여전히 작동하지 않지만 몇 가지 다른 시나리오는 그렇습니다.

첫째, 인터페이스 및 대표 만 지원됩니다.

둘째, Interface/Delegate의 저자는 유형 매개 변수를 다음과 같이 장식해야합니다. in (비밀의 경우) 또는 out (공분산의 경우). 가장 분명한 예는입니다 IEnumerable<T> 당신이 그 가치를 "꺼내"할 수있게 해줄 수 있습니다. 새로운 것을 추가 할 수는 없습니다. 그게 될 것입니다 IEnumerable<out T>. 그것은 유형의 안전을 전혀 해치지 않지만 반환 할 수 있습니다. IEnumerable<string> 반환으로 선언 된 방법에서 IEnumerable<object> 예를 들어.

불안정한 것은 인터페이스를 사용하기위한 구체적인 예를 제시하기가 더 어렵지만 대의원에서는 쉽습니다. 고려하다 Action<T> - 그것은 단지 a를 취하는 방법을 나타냅니다 T 매개 변수. 매끄럽게 사용하는 것은 Action<object> 로서 Action<string> - 취하는 모든 방법 object 매개 변수는 string 대신에. 물론, C# 2는 이미 어느 정도 대표의 공분산과 비난의 대표를 가지고 있지만, 한 대의원에서 다른 대표 유형에서 다른 대표 유형으로 실제 변환을 통해 (새 인스턴스 생성) - 예제는 P141-144를 참조하십시오. C# 4는 이것을보다 일반적으로 만들 것이며 (나는 믿습니다) 전환을위한 새로운 인스턴스를 만드는 것을 피할 것입니다. (대신 참조 변환이 될 것입니다.)

이것이 조금 정리되기를 바랍니다. 이해가되지 않으면 알려주세요!

다른 팁

Jon이 아직 그것을 다루지 않은 것은 아니지만 Eric Lippert의 블로그와 비디오에 대한 링크가 있습니다. 그는 예제로 그것을 설명하는 좋은 일을합니다.

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

비디오 :

https://www.youtube.com/watch?v=3MQDRKBZVQU

https://www.youtube.com/watch?v=xriadqabyli

https://www.youtube.com/watch?v=st9d2edzfrg

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