2011-11-09 3 views
1

를 null로 나열하려면 다음객체 [] 내가처럼 보이는 물체가있는 경우 <Interface> 반환

class Person : IProxy 
{ 
    // Properties 
} 

을 그리고 실제로 List<Person>object 반환하는 방법이 있습니다

object GetList() 
{ 
    List<Person> people = new List<Person>(); 

    person.Add(new Person()); 
    person.Add(new Person()); 

    return people; 
} 

왜 다음 코드 결과가 null입니까?

object {System.Collections.Generic.List<Person>} 
+2

앞에'목록 을의''목록 는'에 관계없이 IProxy에 사람의 관계 _not_입니다 . stackoverflow (역행렬과 공분산)에 관한 이것에 관한 질문의 힙이 있습니다. 간단히 말해 다음과 같이 할 수 있습니다 :'GetList() as List) .Cast ();' – Rob

답변

5

List<Person>List<IProxy> 서로 다른 두 개의 같습니다

var obj = GetList() as List<IProxy>; 

그러나 아래의 코드는 목록 반환로

var obj = GetList() as List<Person>; 

비주얼 스튜디오의 시계 패널을, 내 타입은보고 하나를 다른 것으로 변환하는 타입은 null을 반환 할 수 있습니다.

GetList().OfType<IProxy>() 

원하는대로 할 수 있습니다. 컬렉션이 질문에 더 대답 할 수 이기종 유형

Covariance and Contravariance FAQ 포함되어있는 경우는 예외를 발생하지 않기 때문에 당신은 또한

GetList().Cast<IProxy>() 

는 개인적으로 내가 OfType를 선호 사용할 수 있습니다.

+1

질문에 대한 의견에서 제안한 바와 같이 OfType () 대신에 캐스트 ()을 사용하는 것이 더 좋습니다. 사실 OfType ()은 IProxy 형식이 아닌 모든 요소를 ​​필터링합니다. 이 경우 결과는 동일하지만 일반적인 것은 아닙니다. obj가 실제로리스트 일 필요가있는 경우, 올바른 표현식은 GetList()입니다. 캐스트 () .ToList() – Teudimundo

+0

@Teudimundo .. 고맙습니다 ...나는 내 대답과 합리적으로 편집했다 –

+0

고마워. 이 문제를 해결하고 FAQ를 읽어 보겠습니다. – Darbio

1

List<People>List<IProxy>과 다른 유형이기 때문에. 당신이 class Cat : IProxy을 가지고 있다고 상상해보십시오. List<People>List<IProxy>으로 캐스팅 할 수 있다면 Cat을 추가 할 수 있습니다. 원하지 않을 것이라고 생각합니다. 누락 된 것은 일반적인 반항성입니다. 예를 들어 java에서는 합법적으로 목록을 List<? extends IProxy>으로 전송할 수 있습니다. 그러면 목록에서 IProxy 개의 개체를 읽을 수 있지만 아무 것도 쓸 수 없습니다.

+0

Simon에게 감사드립니다. 실제로 나는 유형이 다를 수있는 IProxy 항목의 목록을 추가해야합니다. 위의 코드는 내가 논리를 테스트하기 위해 만든 추상화였다. – Darbio

+0

'List '의 여러 인스턴스를 통합해야 할 경우'T'가 같지 않지만 항상'IProxy'를 구현하면'proxies = new List ();'목록을 만들고'프록시를 호출 할 수 있습니다. AddRange (사람); proxies.AddRange (otherProxyTypeList);'등등. – phoog

-2

반환 유형이 GetList() 인 이유는 무엇입니까? object? List<Person> 또는 IList<Person>을 지정하는 것이 좋습니다. 그렇게하면 메서드를 호출 한 후에 캐스팅 할 필요가 없습니다. 당신이 당신의 방법에서 List<IProxy>을 원하는 경우에

,이 작업을 수행 할 것입니다 :

List<IProxy> GetList() 
{ 
    List<IProxy> people = new List<IProxy>(); 

    people.Add(new Person()); 
    people.Add(new Person()); 

    return people; 
} 
다음

var obj = GetList(); 
+1

이것이 사실이지만, 질문에 대답하지 않습니다. – Amy

+0

이것은 사실입니다. 그러나 리플렉션을 사용하여 런타임에 객체의 모든 속성을 반환하고 강하게 입력 된 List가 아닌 객체로 값이 반환됩니다. – Darbio

+0

@JD 당신이 게시 한 코드 샘플에서 명확하지 않았던 목록을 생성하고이를 객체로 반환하는 메소드를 보여줍니다. – phoog

관련 문제