2012-08-13 4 views
6

정확한 코드는 내가 만들려고 해요 :왜 이것이 잘못된 변형입니까?

public interface IMapContainer<out T> where T : MapRoomBase 
    { 
     String GetName(); 

     IEnumerable<T> GetRooms(); 
    } 

는이 오류를 받고 있어요 : 잘못된 분산이 : 형식 매개 변수 'T'는 'MapLibrary.IMapContainer.GetRooms()'에 가변되지 유효해야합니다. 'T'는 공변이다.

IEnumerable이 단순히 항목을 반환하고 아무 것도 추가 할 수 없으므로 유효하다는 인상하에있었습니다. 왜 이것이 안전하지 않고 + 유효하지 않은가?

+0

죄송합니다.하지만 왜 'out T'입니까? 그게 '밖으로'필요합니까? –

+0

T가 인터페이스의 매개 변수입니까? 무엇을 성취하려고합니까? 이상하게 보인 내 관점에서. –

+1

@ Xtian, Andre, http://msdn.microsoft.com/en-us/library/dd997386.aspx. –

답변

7

이전 프레임 워크 버전을 타겟팅하고 있지 않은지 확인하십시오. IEnumerable<T>은 .NET 4부터 공변합니다. .NET 4에서 코드가 잘 컴파일되고 .NET 3.5에서 언급 한 오류로 실패합니다.

+0

실제로 여기 Silverlight 4 프레임 워크를 목표로합니다. – Erix

+0

SL 4의 IEnumerable에서 공분산이 지원되지 않는 것 같습니다.이 이유는 이해할 수 없지만 답변을 통해 도움이되었습니다 ... http : // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

공분산은 SL4에서 지원됩니다. IEnumerable 과 같은 BCL 유형은 SL5에서 공변량으로 만 만들어집니다 [SO 대답] (http://stackoverflow.com/a/2558592)/872395) – nemesv

관련 문제