Другие ответы верны, но полезно поразмышлять, почему компилятор помечает это как небезопасное.Предположим, мы это допустили;что может пойти не так?
class Sprocket: Product {}
class Gadget : Product {}
class GadgetFactory : IFactory<Gadget>
{
public List<Gadget> MakeStuff()
{
return new List<Gadget>() { new Gadget(); }
}
}
... later ...
IFactory<Gadget> gf = new GadgetFactory();
IFactory<Product> pf = gf; // Covariant!
List<Product> pl = pf.MakeStuff(); // Actually a list of gadgets
pl.Add(new Sprocket());
и, эй, мы только что добавили звездочку в список, который может содержать только гаджеты.
Есть только одно место, где компилятор может обнаружить проблему,и это в объявлении интерфейса.
Извините за несколько чрезмерно жаргонное сообщение об ошибке.Я не мог придумать ничего лучшего.