2

IReadOnlyCollection으로 변환하려고 할 때 컴파일러가 다르게 처리하는 다른 컬렉션 (모두 IReadOnlyCollection 인터페이스를 구현하는 컬렉션)은 왜 다릅니 까?/Stack<int>Queue<int>이/... 암시 IReadOnlyCollection<int>로 변환 할 수 없습니다IReadOnlyCollection에 대한 암시 적/명시 적 캐스트 혼동

유형 : 나는 .NET 4.5으로 VisualStudio 2015

위의 경우에서 컴파일러 오류가 사용하고

IReadOnlyCollection<int> a = new List<int>();  // everything fine 
IReadOnlyCollection<int> b = new HashSet<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> c = new Stack<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> d = new Queue<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> e = new LinkedList<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> f = new SortedSet<int>(); // compiler wants me to cast 

이있다 . 명시 적 변환이 존재합니다. 캐스트가 누락 되었습니까?

(이것은 실제 텍스트 아니지만, 난 당신이 날 여기에 독일의 텍스트를 복사 - 붙여 넣기 싶지 않을 것이다 생각합니다.)

나는

IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>; 

또는하여 캐스트를 할 경우 by

IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>(); 

모든 것이 좋습니다. 컴파일이나 런타임 오류가 발생하지 않습니다.

+0

IReadOnlyCollection은 .NET 4.5부터 알고 있습니다. – Kjara

+0

'List'는 일반적인 클래스입니다. 예를 들어'LinkedList'는 List 클래스의 하위 클래스입니다. 그것은 상속 문제일지도 모르지만 그 답을 배우고 싶습니다. – pilkington

+0

나는 이것을 재현 할 수 없다. 아마도 우리에게 한 가지 단서가 될 수있다. 컴파일러가 무엇을 오류나 경고로 말하고 있는지 말해 줄 수 있을까? –

답변

2

.NET 4.6 이상을 대상으로하는 경우 컴파일됩니다. . (예를 들어)이 버전 SortedSet에서

는 ("정의로 이동을 마우스 오른쪽 버튼으로 클릭에 의해 확인 및 선택)

전체 목록입니다 IReadOnlyCollection을 구현하지 :

ISET < T>, ICollection에 < T>를 IEnumerable < T>를 IEnumerable, ICollection은, ISerializable 것, IDeserializationCallback, IReadOnlyCollection < T>

4.5에서 단지 구현합니다

ISET < T>, ICollection이 < T>, IEnumerable을 < T>, ICollection이는 IEnumerable을은 ISerializable 것, IDeserializationCallback

는 문서 (I 다음, 다른 말한다면 'm 두려워.) 문서가 잘못되었습니다.

관련 문제