2017-12-15 28 views
0

이 변환 유형을 허용하지 않는 이유를 알고 싶습니다. 이 post in SO에서 주제가 이미 다뤄졌지만 이것이 왜 자연적으로 가능하지 않은지에 대한 낮은 수준의 설명을 원합니다.C#에서 개체에 익명 캐스트를 허용하지 않는 이유는 무엇입니까?

왜 이러한 캐스트가 실패합니까?

OBS : 리플렉션을 통해 가능하다는 사실을 알고 있습니다. anonymous이 성공적으로 IList<People> 또는 List<People>에 캐스트 할 수없는 이유

IList<People> peopleList = new List<People>() 
{ 
    new People() { Name = "Again", Age = 10 }, 
    new People() { Name = "Over", Age = 20 }, 
    new People() { Name = "Jonh", Age = 30 }, 
    new People() { Name = "Enzo", Age = 40 }, 
}; 

var anonymous = (from p in peopleList 
       select new 
       { 
        Name = p.Name, 
        Age = p.Age 
       }); 

// Does not work 
IList<People> listt = (IList<People>)anonymous; 
//Does not Work 
IList<People> listt = (anonymous as List<People>); 
+8

나는 그것이 * 작동해야한다고 생각하는 것이 흥미로울 것 같다. 익명 형식은 필드가 같더라도 다른 형식이 아닙니다. 동일한 다른 유형, 익명 또는 아닙니다 간다. 그것이 언어가 구축 된 방법입니다. C#에서는 오리 타입이 없습니다. – nvoigt

+1

왜 작동해야합니까? 그것은 익명의 타입이지,'People' 인스턴스가 아닙니다. 하나에서 다른 것으로 상상할 수있는 캐스트가 없습니다. 캐스트는 "이 객체를 다른 동등한 유형처럼 취급합니다"를 의미합니다. 이 익명 유형이'People'과 동일하다는 것은 아무것도 없습니다. 애완 동물을 대표하는 데 사용한다면 어떨까요? –

+3

'개'에게 '사람'을 캐스팅 할 수 있습니까? 둘 다 이름과 다리가 있습니다. 왜 캐스트가 작동하지 않습니까? –

답변

5

질문입니다.

  • 쿼리 식의 값은 쿼리를 실행할 수있는 개체 인 입니다. 쿼리 실행의 결과 집합이 아닙니다. anonymousIList<T>이 아니라 IEnumerable<T>을 구현하며 확실히 하위 유형 List<T>이 아닙니다. 따라서 IList<T> 또는 List<T> 유형으로 전송할 수 없습니다. 원하는 것이면 ToList()을 사용하여 쿼리를 실행하고 결과 집합을 목록에 저장하십시오.
  • 쿼리를 IEnumerable<People>으로 전송할 수 있습니까? 아니요. People과 연결된 값 중 일부를 복사 한 일련의 익명 형식 개체입니다. 그래서 일련의 익명의 객체가 아니라 일련의 익명의 객체입니다.

새로운 C# 7 코드에서는 응용 프로그램에서 사용할 수있는 경우 익명 형식 대신 튜플을 사용하는 것이 더 좋습니다. 그들은 형식 ​​시스템에서 더 나은지지를 얻고 수집 압력을 낮추게됩니다.