As already answered by @ehiller, it's only possible to have covariant returns if a property is readonly, but you can still set its value when calling the constructor. Here's an example:
public interface IBase {
void Method1();
}
public interface IDerived : IBase {
void Method2();
}
public class Base {
public virtual IBase Property { get; }
public Base(IBase b) {
Property = b;
}
public void CallMethod1() {
Property.Method1();
}
}
public class Derived : Base {
// Property with covariant return.
public override IDerived Property { get; }
public Derived(IDerived d) : base(d) {
Property = d; // No setter, but it's legal to set the value here.
}
public void CallMethod2() {
Property.Method2();
}
}