Если вы используете C # 4 (.NET 4), вы можете просто удалить приведение в последней строке:
list1.AddRange(list2);
Если вы используете C # 3 (.NET 3.5)вам нужно использовать расширение LINQ для Cast ():
list1.AddRange(list2.Cast<MyType>());
Причина, по которой вы не можете преобразовать list2 в List, заключается в том, что List не является ковариантным.Вы можете найти хорошее объяснение того, почему это не так:
В C #, почему объект List не может быть сохранен в List variable
Причина, по которой первая строка работает, заключается в том, что AddRange () принимает IEnumerable, а IEnumerable является ковариантным..NET 3.5 не реализует ковариацию обобщенных коллекций и, следовательно, необходимость в Cast () в C # 3.