2016-06-23 1 views
0

누군가 내가 아래의 컴파일 오류가 발생하는 이유를 설명해 주실 수 있습니까? BlockingCollection<T>IReadOnlyCollectio<T> 인터페이스를 구현하며 다른 인터페이스에는 문제가 없습니다. 왜 명시 적 캐스트가 필요한데, List<T>에 대해 동일한 작업을 수행해야하는 이유는 무엇입니까?BlockingCollection을 IReadOnlyCollection <T>에 <T>으로 할당 할 수없는 이유는 무엇입니까?

'System.Collections.Concurrent.BlockingCollection<string>''System.Collections.Generic.IReadOnlyCollection<string>'으로 암시 적으로 변환 할 수 없습니다. 명시 적 변환 (당신은 캐스트를 누락?) 존재

IReadOnlyCollection<string> roListItems = new List<string>(); // ok (baseline check) 

IEnumerable<string> enumBCItems = new BlockingCollection<string>(); // ok 
System.Collections.ICollection colBCItems = new BlockingCollection<string>(); // ok 
IReadOnlyCollection<string> roBCItems = new BlockingCollection<string>(); // fail 
IReadOnlyCollection<string> roExplicitBCItems = (IReadOnlyCollection<string>)new BlockingCollection<string>(); // ok.... 

아래

나는 그러므로 내 혼란을 선언을 볼 때 ReSharper에서이 나를 보여주는 된 것입니다 편집.

// Type: System.Collections.Concurrent.BlockingCollection`1 
// Assembly: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
// MVID: BD5F7037-65C4-4C44-8FBC-F45D80D7550F 
// Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll 

public class BlockingCollection<T> : IEnumerable<T>, IEnumerable, ICollection, IDisposable, IReadOnlyCollection<T> 
{ ... } 
+1

.NET에서 해당 인터페이스를 구현하지 않았고, 그것은 '다른 버전'선택기를 사용하여 미세 –

+3

근무 클래스가 원래 'IReadOnlyCollection'을 구현 한 것처럼 보이지 않습니다. .NET 4.0을 사용하고있을 것 같습니까? –

답변

6

내가 LinqPad에 그 코드 블록을 복사 4.

public class BlockingCollection<T> : IEnumerable<T>, ICollection, IEnumerable, IDisposable 

https://msdn.microsoft.com/en-us/library/dd267312(v=vs.100).aspx

+2

그리고 이야기의 두 번째 절반은 .NET 4.5입니다. 즉, .NET 4.0을 대상으로하더라도 코드가 여전히 .NET 4.5 라이브러리와 함께 실행됩니다. 즉, IReadOnlyCollection roBCItems = new BlockingCollection ()이 제공됩니다. 컴파일러 오류가 있지만 명시 적 형변환을 수행하면 런타임 오류가 발생하지 않습니다. –

+0

@trydis 정확합니다. Resharper는 나에게 숫자를 가져왔다. 수정보기 – jasper

관련 문제