Подумайте об этом, если вы выполняете такое приведение, а затем добавляете объект типа Foo в список, список строк больше не является согласованным. Если бы вы итерировали первую ссылку, вы бы получили исключение приведения класса, потому что, как только вы нажмете экземпляр Foo, Foo не сможет быть преобразован в строку!
В качестве примечания, я думаю, что было бы более важно, можете ли вы сделать обратный бросок:
List<object> ol = new List<object>();
List<string> sl;
sl = (List<string>)ol;
Я давно не использовал C #, поэтому я не знаю, является ли это законным, но этот тип приведения действительно (потенциально) полезен. В этом случае вы переходите от более общего класса (объекта) к более конкретному классу (строке), который расширяется от общего. Таким образом, если вы добавляете в список строк, вы не нарушаете список объектов.
Кто-нибудь знает или может проверить, является ли такое приведение законным в C #?