2011-09-14 10 views
2

가능한 중복 : 나는이 없다는 컴파일러 오류가 발생,일반 목록 <T>

private List<DateTime> _dateTimes = new List<DateTime>(); 
private List<String> _strings = new List<String>(); 

private List<List<Object>> _listOfLists = new List<List<Object>>(); 

_listOfLists.Add(_dateTimes); 
_listOfLists.Add(_strings); 

을하지만 :


In C#, why can't a List<string> object be stored in a List<object> variable

나는이 작업을 수 있다고 생각. 메소드에 몇 가지 잘못된 인수가 있습니다 ... 이유를 아는 사람이 있습니까? 일반 목록 목록을 갖는 솔루션은 무엇이 될 수 있습니까?

+0

두 개의 호출 중 하나에서 .Add를 얻으면 오류가 발생합니까? :디 –

답변

5

유형 안전과 관련된 이유로 List<string>List<object>으로 처리 할 수 ​​없다는 문제가 있습니다. 당신이 할 수 있다면, 이것은 가능할 것이다 :

var list = (List<object>)(new List<string>()); 
list.Add((object)42); // this should never be allowed to compile 

당신 할이 있습니다 : List<T>IList를 구현하므로

private List<DateTime> _dateTimes = new List<DateTime>(); 
private List<String> _strings = new List<String>(); 

private List<IList> _listOfLists = new List<IList>(); 

_listOfLists.Add(_dateTimes); 
_listOfLists.Add(_strings); 

이 작동합니다. 물론 컴파일 타임 형식 안전을 상실하여 코드 컴파일을 "강제"했습니다. 본질적으로 잘못된 유형의 객체를 IList 인스턴스 중 하나에 추가하려고하면 런타임 예외가 발생한다는 것을 인정합니다.

0

List<string>은 아니요 List<object>입니다. 이 경우 런타임에 List<string>List<object>으로 캐스팅 한 다음 string 이외의 유형으로 Add 메서드를 호출 할 수 있습니다. 이는 목록의 상태를 손상시킵니다.