C#에서이 문제가 발생하는 이유는 무엇입니까?사전에서 IEnumerable의 하위 유형을 반환 할 수 없습니다.
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
C#에서이 문제가 발생하는 이유는 무엇입니까?사전에서 IEnumerable의 하위 유형을 반환 할 수 없습니다.
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
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>>();
을 ...하지만 당신이 반환 할 수 있습니다 :
이 반환 할 수 없습니다
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라고 물었습니다.
Jakob - 향후 문제에 대해 더 자세히 설명해주십시오. 이번에는 귀하의 질문에 답변을 드릴 수 있었지만 문제에 대한 자세한 설명은 귀하의 질문에 대한 답변에 도움이됩니다. – tnw