Это та же самая причина, по которой вы не можете разыграть List<string>
до List<object>
.
Допустим, в Mammal
есть свойство с именем Owner
например:
public TOwner Owner { get; set; }
Для экземпляра Mammal<IOwner>
это становится:
public IOwner Owner { get; set; }
dog
- это Dog<Human>
, что также является Mammal<Human>
. Если вы можете привести dog
к Mammal<IOwner>
, это будет означать, что dog.Owner
может внезапно хранить любой тип, который реализует IOwner
.то есть это было бы возможно:
class EvilOwner : IOwner { ... }
Mammal<IOwner> mammal = (Mammal<IOwner>)dog;
mammal.Owner = new EvilOwner();
Но это невозможно, потому что dog
во время выполнения - это Dog<Human>
, который имеет Owner
Human
.EvilOwner
не может быть сохранено в Human
!
Я предлагаю вам удалить общий параметр TOwner
.Если, по вашему мнению, Dog<Human>
также является разновидностью Mammal<IOwner>
, то, вероятно, имеет смысл проектировать классы следующим образом:
public interface IAnimal {
IOwner Owner { get; }
}
public abstract class Mammal : IAnimal { ... }
public class Dog : Mammal { ... }