Это невозможно на любом языке .NET из-за проблем безопасности типов. В типобезопасных языках вы должны предоставить ковариацию для возвращаемых значений и противоположность для параметров. Возьми этот код:
class B {
S Get();
Set(S);
}
class D : B {
T Get();
Set(T);
}
Для методов Get
ковариация означает, что T
должен быть либо S
, либо типом, полученным из S
. В противном случае, если у вас есть ссылка на объект типа D
, хранящийся в переменной с типом B
, при вызове B.Get()
вы не получите объект, представляемый в виде S
, что нарушает систему типов .
Для методов Set
, контравариантность означает, что T
должен быть либо S
, либо типом, из которого S
происходит. В противном случае, если у вас была ссылка на объект типа D
, хранящийся в переменной типа B
, когда вы вызывали B.Set(X)
, где X
был типа S
, но не типа T
, D::Set(T)
получит объект типа, которого он не ожидал.
В C # было сознательное решение запретить изменение типа при перегрузке свойств, даже если у них есть только одна из пары геттер / установщик, потому что иначе это могло бы иметь очень противоречивое поведение ( " может изменить тип на тот, у которого есть получатель, но не тот, у которого есть и получатель, и установщик? Почему бы и нет?!? * - Anonymous Alternate Universe Newbie).