개체에 문자열을 업 캐스트 할 수 있지만 IList 개체에 IList 문자열을 업 캐스트 할 수 없습니다. 어째서? 새로운 IList에 모든 항목을 복사하는 지금해야 할 일은 무엇입니까?C# : 제네릭 내에서 캐스팅하지 않습니까?
static void ThisWorks()
{
IList<object> list = new List<object>();
list.Add("I can add a string since string : object");
}
static void ThisDoesNotWork()
{
// throws an invalid cast exception
IList<object> list = (IList<object>) new List<string>();
list.Add("I'm never getting here ... why?");
}
이것은 LSP를 존중합니다 : * 더 * 파생 된 유형 (문자열)을 * 적은 * 파생 된 유형 (객체)으로 취급합니다. 일반적으로 이것은 안전한 것으로 생각됩니다. –
아니요. 그는 바나나 바구니에서 과일 바구니를 만들려고합니다. 그가 독서를하는 동안은 안전하지만 문자열이 추가되지 않으면 이상하게됩니다. –
사실, 이는 ** safe ** generic co/contravariance를 지원하는 C# 4.0과 같은 일부 경우에서 가능할 수 있으므로 예제가 완전히 사실이 아닙니다. –