Поскольку тип List {T} является инвариантом , во втором случае можно будет выполнить:
List<object> lst = new List<string>();
lst.Add(10);
Это недопустимо, поскольку вы добавляете Int32 всписок строк.
Тип IEnumerable {out T} является ковариантным, как следует из 'out'.Это означает, что невозможно добавлять элементы к нему, только получать элементы из него, что делает первый оператор действительным.
Это, однако, действительно:
List<object> lst = new List<object>();
lst.AddRange(new string[] { "hello" });