Вы правы, что это связано с ковариацией;в частности, это связано с виртуальным методом, возвращаемым типом ковариации , который не является разновидностью ковариации, поддерживаемой языком C #.
Обратите внимание, что даже если это так, система, которую вы описываете, не являетсявведите безопасный.Предположим, у нас есть:
interface IAnimal {}
interface IGiraffe : IAnimal {}
interface ITiger: IAnimal {}
class Tiger : ITiger {}
interface IHaveAnAnimal { IAnimal Animal { get; set; } }
class C : IHaveAnAnimal
{
public IGiraffe Animal { get; set; }
}
...
IHaveAnAnimal x = new C();
x.Animal = new Tiger(); // Uh oh. We just put a Tiger into a property of type IGiraffe.
Даже если ковариация была бы вообще законной, этот вид ковариации не был бы законным;вам нужно иметь без установщика , чтобы ковариация была допустимой.
Предположим, что у вас нет установщика:
interface IAnimal {}
interface IGiraffe : IAnimal {}
interface ITiger: IAnimal {}
class Tiger : ITiger {}
interface IHaveAnAnimal { IAnimal Animal { get; } }
class C : IHaveAnAnimal
{
public IGiraffe Animal { get; }
}
К сожалению, это все еще не разрешено,Но вы можете сделать это:
class C : IHaveAnAnimal
{
IAnimal IHaveAnAnimal.Animal { get { return this.Animal; } }
public IGiraffe Animal { get; }
}
Теперь, когда C используется как C, Animal возвращает жирафа, а когда используется IHaveAnAnimal, он возвращает IAnimal.