2012-12-17 4 views
1

나는 C#에서 공분산과 같은 것을하고 싶었지만 여기에는 상속이 없다.리스트에 <Ttype>리스트 <TInterface> C#에서?

public interface IBirthday 
{ 
    void Dance(); 
} 


public class Birthday:IBirthday 
{ 
public void Dance() 
    {} 
} 


void Main() 
{ 
    List<Birthday> l= new List<Birthday>(); 
    List<IBirthday> d = l; //<--- How can I accomplish that ? 
} 

가 어떻게이 일을 할 수 있습니다 :

이 코드가? LINQ가 유일한 선택입니다

List<IBirthday> d = list of birthdays ? 

가 반복하는 작업을 수행/(그리고 반복하는 외에 LINQ (또는 루프) 수동으로 구축)?

+3

['Cast'] (http://msdn.microsoft.com/en-us/library/bb341406.aspx)를 사용해 보셨습니까? – Oded

+6

당신은 공분산이 부족하기 때문에 타입 안전하지 않을 수도 있습니다. 당신은'IEnumerable d = l;'할 수 있어야합니다. – millimoose

+0

왜 'List '을 원하십니까? 이것이 바로 여기의 핵심이며 유스 케이스는 작아 보인다. –

답변

6

그것은 (당신에서 숨겨 질 수 있지만,이 곳 일어나야한다) 새로운 목록을 작성하지 않고 List<IBirthday>List<Birthday>을 할당 아니다. 당신이하려고했던 어떤 사람이했을 때 무슨 일이 일어날 지 다음 수 있다면

는 :

public class UnBirthday : IBirthday { ... } 

d.Add(new UnBirthday()); 

글쎄, 그것은 List<IBirthday>, 그래서 그것이 새 항목을 추가 할 수 있다고 생각합니다. 하지만 기본 목록은 실제로 List<Birthday>이며 UnBirthday을 해당 목록에 추가 할 수 없습니다. 이 문제를 허용하는 것과 런타임에 충돌하는 것 사이의 선택을 감안할 때, C#은 처음부터 허용하지 않는다는 결정을 내렸습니다.

일반적인 인자 공분산을 사용하는 유일한 방법은 정보를 읽을 수 있고 정보를 입력 할 수없는 것에 할당하는 것입니다.이 예는 IEnumerable<T>입니다. 매 BirthdayIBirthday이며, IEnumerableBirthday없는 새 IBirthday을 부여 할 수있는 방법은 그렇게 말하고, 없다 :

List<Birthday> l= new List<Birthday>(); 
IEnumerable<IBirthday> d = l; 

작품 잘.

+0

'ReadOnlyListWrapper U : T'는'IList '을 래핑하고'IList '을 구현하고 그 자체를 읽기 전용으로보고 할 수 있습니다. 그러한 것은'T'를 원래 목록에 저장할 수 없지만 목록의 "라이브"보기를 제공하고 복사 할 필요는 없습니다. – supercat

+0

@supercat 그건 내가 마지막으로 paragragh에서 다루는 것입니다, 그것은 공변 인터페이스의 또 다른 예입니다. (.NET 4에서는'IReadOnlyList'를 사용할 수 있습니다.5 그리고 그것은'List' 나'IEnumerable'과 똑같은 방식으로 배열을 처리 할 것입니다.) – Servy

+0

내 포인트는 그렇게 할 내장 클래스가 없더라도 쉽게 래퍼 클래스를 작성할 수 있다는 것입니다 'IList '가'IEnumerable '뿐 아니라'IList '(인덱스별로 개별 항목의 "라이브"읽기 허용)으로 사용될 수 있습니다. – supercat

3

당신은 사용할 수 있습니다

d = l.Cast<IBirthday>.ToList(); 
+4

기존 목록에 새보기를 할당하지 않고 완전히 새로운 목록을 만드는 것입니다. 그것은 의미 론적으로 당신이 원하는 것일 수도 아닐 수도 있습니다. – Servy

+0

나는 반복을 쓰지 않았다. (niether linq) –

+0

@Servy 사실, 나는 이것을 고려하지 않았다. 이걸 어떻게 감당할 수있을 지 모르겠다. – TheEvilPenguin

관련 문제