2010-01-04 3 views

답변

23

최대 당신은

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>()); 

이이 경우에 List<ISomeInterface>의 생성자가 IEnumerable<ISomeInterface>을 취한다는 것입니다 작동하지 않는 이유는 다음을 수행하여이 문제를 해결할 수 있습니다. 목록 변수의 유형은 IEnumerable<objectA>로만 변환 가능합니다. objectAISomeInterface으로 변환 될 수 있지만 IEnumerable<objectA> 유형은 IEnumerable<ISomeInterface>으로 변환 할 수 없습니다.

이 변경 사항은 C# 4.0에서 언어에 Co 및 Contravariance 지원을 추가하고 이러한 변환을 허용합니다.

+1

@itowlson, 사용자가 샘플에서 수행하는 작업입니다. 추가 동작이 원하는 솔루션의 일부임을 지정하지 않았습니다. – JaredPar

+1

당신은 C# 3.5가 아니라 .NET 3.5를 의미합니다. –

1

이것은 C# 4.0에서 처리되었으므로 C# 3.5에서는 직접 처리 할 수 ​​없습니다. 그러나이 목록에서 새 목록을 만들고 확장 연산자 또는 foreach를 사용하여 C# 4에서 공분산 contravariance (항상 잘못된 것임)로 제공 될 유형의 캐스트보다 느리지 만 명확하게 처리 할 수 ​​있습니다.

C#을 3.0 + 닷넷 3.5에서
+1

야렛 내 의견을 참조하십시오 모두 ... 샘플 코드가 동일하고 당신이 원하는 각 하나를 사용할 수 있습니다 위의

var interfaceList = list.Cast<ISomeInterface>().ToList() 

또는

List<ISomeInterface> interfaceList = list.Cast<ISomeInterface>().ToList() 

- C# 3.5와 같은 것은 없습니다. –

+0

Arg, Futurama의 보우 라 츄라를 상기시켜줍니다. Linq는 언어 변경이 있었지만 C# 3.5까지 소개되지 않았기 때문에 C#은 linq 확장이 주어질 때까지 2.0이었습니다. WCF는 단순히 3.0에서 프레임 워크 업그레이드였습니다. – Spence

3

가장 쉬운 & 짧은 방법은 다음과 같습니다

+0

오른쪽에서 ToList()를 사용하는 것이 좋습니다. 그러나 var를 사용하면 변수의 실제 유형이 숨겨 지므로이 작업을 수행하는 것은 좋지 않습니다. 목록 interfaceList = list.Cast (). ToList(); 그래서 가장 명확하고 가장 짧은 버전 –

+0

@ KovácsEde로이 양식을 사용했습니다. 언급 한 내용에 따르면이 답변에 대한 두 번째 형식이 추가되었지만 둘 모두 동일합니다. 'var'을 사용할 때, 실제로는 더 짧은 형식으로 코드를 작성하고 항상'= '의 오른쪽을보고 변수 유형을 인식 할 수 있습니다. 반면에 우리가'var'을 사용할 때조차도, C# 컴파일러는 변수의 실제 타입을 인식하기에 충분합니다. 따라서 더 짧은 구문을 사용하려면'var'을 사용하고'= '오른쪽의 코드에서 변수 유형을 인식하면 다른 형식을 사용할 수 있습니다. – RAM