Cast IList <string> do IList <object> kończy się niepowodzeniem w czasie wykonywania

Mam następujący krótki program C #:

IList<string> listString = new List<String>();
IList<object> listObject;

listObject = listString;

Ten program się nie kompiluje. Ostatnia linia powoduje następujący błąd kompilacji:

Nie można niejawnie przekonwertować typu „System.Collections.Generic.IList” na „System.Collections.Generic.IList”. Istnieje jawna konwersja (czy brakuje Ci rzutu?)

Dodałem obsadę:

listObject = (IList<object>)listString;

Teraz program kompiluje się poprawnie, ale nie działa w czasie wykonywania. NaInvalidCastException jest wywoływany z następującym komunikatem:

Nie można rzutować obiektu typu „System.Collections.Generic.List'1 [System.String]”, aby wpisać „System.Collections.Generic.IList'1 [System.Object]”.

Albo rzut jest nielegalny i powinien zostać przechwycony przez kompilator, albo jest legalny i nie powinien rzucać wyjątku w czasie wykonywania. Dlaczego niespójne zachowanie?

WYJAŚNIENIE: Nie pytam, dlaczego obsada się nie udaje. Rozumiem, dlaczego takie rzucanie jest problematyczne. Pytam, dlaczego obsada się nie udajetylko w czasie wykonywania.

questionAnswers(5)

yourAnswerToTheQuestion