Точно так же вы знаете , почему вы получаете эту ошибку, ICollection<Customer>
не может быть передано ICollection<Human>
, потому что это не одно и то же. Подумайте об этом так, если бы у вас было ICollection<Human>
, вы могли бы Add(new Deadbeat())
, если Deadbeat
получено из Human
.
Другие ответы о том, как избежать вашей проблемы с помощью универсального решения вашей проблемы (поэтому они должны получить ответ за кредит):
public static void DoStuff<T>(ICollection<T> source) where T : new()
{
T c = new T();
...
source.Add(c);
}
но я просто хотел выбросить этот ответ, чтобы объяснить почему вы получаете эту ошибку. Подумайте об этом, если бы вы могли передать коллекцию Customer
как коллекцию Human
, это позволило бы вам добавить ЛЮБОГО вида человека, и это нарушило бы исходную коллекцию.
Таким образом, даже если Customer
расширяет Human
, это не означает, что ICollection<Customer>
расширяет ICollection<Human>
и ICollection<T>
не является ковариантным / контравариантным, поскольку использует T
как для in
, так и out
операции.