2013-07-17 3 views
1

개인 필드가 IList<DerivedClass> _elements이고 IReadOnlyCollection<BaseClass>을 반환하는 속성을 생성하려고합니다.IList <Derived>을 IReadOnlyCollection으로 변환 <Base>

public IReadOnlyCollection<BaseClass> BaseClasses 
{ 
    get { return _elements; } // compile time error 
} 

컴파일 오류없이 실행하는 방법은 무엇입니까? (이 작동합니다 AFAIK IReadOnlyCollection<T>T이 공변 한,)

+0

정확히 컴파일 시간 오류가 무엇입니까? –

답변

5

사용 List<T>.AsReadOnly() 방법

:

public IReadOnlyCollection<BaseClass> BaseClasses 
{ 
    get { return _elements.Cast<BaseClass>().ToList().AsReadOnly(); } // compile time error 
} 

또는 IReadOnlyCollection<T> 이후 공변되고 당신은 Cast<BaseClass> 건너 뛸 수 있습니다 :

public IReadOnlyCollection<BaseClass> BaseClasses 
{ 
    get { return _elements.ToList().AsReadOnly(); } // compile time error 
} 

필드가인 경우 ToList()을 건너 뛸 수도 있습니다., 아니 IList<T>.

+0

고맙습니다. 마지막으로 작은 추가 질문 : AsReadOnly()도 건너 뛸 수있는 것처럼 보입니다. 그것을 무시하는 것은 나쁜 습관입니까? 잠재적 인 API 사용자가 비 - 읽기 전용으로 악마 캐스팅을 할 수 있다고 생각합니다. –

+0

'ILead '은'IReadOnlyCollection '을 구현하지 않으므로'AsReadOnly'를 건너 뛸 수 없습니다. – MarcinJuraszek

+0

ToList()를 저장하기 위해 IList 대신 List 으로 전환했습니다. List는 IReadOnlyCollection 도 구현하는 것 같습니다. –

관련 문제