2013-05-03 3 views
3

C#에서이 문제가 발생하는 이유는 무엇입니까?사전에서 IEnumerable의 하위 유형을 반환 할 수 없습니다.

public Dictionary<string, IEnumerable<object>> GetProducts() { 
    return new Dictionary<string, IList<object>>(); 
} 
+0

Jakob - 향후 문제에 대해 더 자세히 설명해주십시오. 이번에는 귀하의 질문에 답변을 드릴 수 있었지만 문제에 대한 자세한 설명은 귀하의 질문에 대한 답변에 도움이됩니다. – tnw

답변

3

IList<object> 값을 갖는 사전을 creata로 할 수 있기 때문에 불가능합니다. 당신은

그래서 전화 할 경우 : 그것은, 그것은 외설되는이에있는 입력 IList<object>의해야 할 값 때문에

IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq; 
Dictionary<string, IEnumerable<object>> products = GetProducts(); 
products.Add("MyKey", values); 

귀하의 반환 사전, 그것을 수락하지 않습니다 underneat IEnumerable<object>하지만 사전을 받아 들일 것입니다 '티.

new Dictionary<string, IList<object>>(); 

을 ...하지만 당신이 반환 할 수 있습니다 :

1

이 반환 할 수 없습니다

new Dictionary<string, IEnumerable<object>>(); 

를 .. 또는 수익 형 변경 :

public Dictionary<string, IList<object>> GetProducts(){ ... } 

파트 이것의 추론 :

반환 된 사전을 Dictionary<string, IEnumerable<object>>으로 가져올 수 있지만 IEnumerable<object> (List이 더 구체적인 유형 인 IEnumerable 인) 대신 List<object> 인 값을 갖는 경우를 상상해보십시오. 당신의 요소 유형 IEnumerable<object>의 사실 아니기 때문에, 잘못된 동작 것

당신이 다음에 새 IEnumerable<object>을 추가하려고하면

, 오히려 List<object>.

이 허용되지 이유는, 유형 List<object> 힘의 요소 (그리고 않습니다)는 IEnumerable<object>하지 않는 방법을 포함하고 있다는 점이다.

IEnumerable<object> 요소를 Dictionary<string, List<object>>에 추가한다고 가정 해보십시오. 즉, 각 요소에 List<object>이라는 특정 메서드를 호출 할 수 있습니다. 에 도달하면 해당 메서드가 정의되지 않은 첫 번째 IEnumerable<object> 요소에 도달하므로 예외가 발생합니다.

원본 코드로 인해 컴파일 타임 오류가 발생하여 이와 같은 문제가 발생하지 않습니다.

나는 더 이상 이것을 이해하는 데 도움이 될 related question라고 물었습니다.