Не существует такой вещи, как «постоянное» приведение (или, скорее, идея «постоянного броска» бессмысленна, поскольку это подразумевает, что приведение делает что-то с объектом , что и делает нет, так что нечего либо упорствовать, либо отменить). Ваша переменная имеет тип H
, и тип переменной никогда не изменится. Ваш экземпляр имеет тип H1
, и тип экземпляра никогда не изменится. Приведение просто говорит компилятору: «Да, хотя я только ссылаюсь на этот экземпляр как тип H
, я на самом деле знаю, что он имеет тип H1
, поэтому безопасно хранить его в любой переменной, которая может ссылаться на экземпляр H1
".
Если ваша структура выглядит следующим образом:
class H
{
}
class X
{
public H HValue { get; private set; }
public X(H h)
{
HValue = h;
}
}
class H1 : H
{
public void Foo() { }
}
class X1 : X
{
public X1(H1 h1) : base(h1)
{
}
}
Тогда вам придется хранить значение для переменной h1
где-то еще, если вы всегда хотите использовать это значение без принижения.
Теперь, немного "вонючий" способ выполнить то, что вы хотите (не нужно каждый раз писать код приведения), вы можете сделать это:
class X1 : X
{
public X1(H1 h) : base(h) { }
public new H1 HValue
{
get { return (H1)base.HValue; }
}
}
Это позволит вам ссылаться на то же свойство с именем HValue
везде, где у вас есть ссылка на X1
в переменной типа X1
. Итак ...
X x = new X1(new H1()); // x.HValue would be of type H, even though the
// reference itself is H1
X1 x = new X1(new H1()); // x.HValue would be of type H1