В чем разница между ковариацией и апкастингом, или, более конкретно, почему им даны разные имена?
Я видел следующий пример, называемый «апкастингом»:
string s = "hello";
object o = s; //upcast to 'string' to 'object'
В то время как Следующее, что я видел, называется «ковариацией»:
string[] s = new string[100];
object[] o = s;
IEnumerable<string> ies = new List<string>();
IEnumerable<object> ieo = ies;
На мой неопытный взгляд, ковариация кажется такой же, как апкастинг, за исключением того, что она относится к приведению коллекций. (Аналогичное утверждение можно сделать относительно контравариантности и понижающего преобразования.)
Неужели это так просто?