Как отмечает Джаред, это невозможно. Однако интересно подумать, почему бы и нет.
Предположим, что поле является частным. Тогда к нему нельзя получить доступ в производном классе B. (Предполагая, что B не является вложенным типом A.)
Предположим, поле не является частным. Не имеет значения, является ли он публичным, внутренним, защищенным или защищенным внутренним. Предположим, что его публика, и это было законно. Теперь у вас следующая ситуация.
class B : A
{
override public D argument; // "overrides" A.argument
}
class E : C { }
class F
{
public static void M(A a)
{ a.argument = new E(); }
}
...
F.M(new B());
И эй, ты только что разбил среду выполнения. Вы просто записали объект типа E в поле, которое может хранить только тип D. (Мы могли бы создать аналогичные сценарии сбоя для других конфигураций, таких как защищенные поля и т. Д.)
Теперь, вы можете сказать, что ж, вместо этого позвольте мне сделать свойство только для чтения. Что я могу виртуализировать:
class A
{
public virtual C Argument { get; }
}
class B : A
{
public override D Argument { ... }
}
Теперь проблемы исчезают. Публичный интерфейс недоступен для записи, поэтому нет проблем с тем, что кто-то там пишет что-то, что не поддерживается. И свойство является виртуальным, поэтому есть механизм для его переопределения.
Эта функция называется "ковариацией возвращаемого типа", и она также не поддерживается в C #. См. Почему понятия «ковариантность» и «контравариантность» применимы при реализации методов интерфейса? .
Пожалуйста, объясните, что вы действительно пытаетесь сделать, а не как вы пытаетесь это сделать. Возможно, есть лучший способ.