Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Поясните неявное приведение


Автор: nvb 27.9.2012, 09:12
изучал оф.мануал, рихтера и нейджела. залип вот на каком моменте:
 "в С# нет специального синтаксиса для приведения типа объекта к его базовому типу, поскольку такое приведение считается безопасным неявным преобразованием"

Код

public class A
{
  public int a;
  public virtual void  ToStr(){Console.WriteLine("Base "+a);}
  public A(int a){this.a=a;}
}
public class B:A
{
    public int b;
    public override void  ToStr(){Console.WriteLine("Derived "+a+" "+b);}
    public B(int a,int b):base(a){this.b=b;}
}
 
class Entry
{
    public static void  Main()
    {
        A a=new A(5);
        B b = new B(10,10);
        a=b;
 
    }
}

 
1. Что происходит с данными класса-наследника при таком приведении? Насколько я помню в С происходило усечение класса,т.е. данные уникальных полей наследника терялись. в С# такое приведение является безопасным...т.е. данные сохраняются каким то образом и к ним можно обратиться?
И почему, собственно, обратное приведение небезопасно, тут-то данные точно не потеряются?
понимаю, вопрос туп, но что-то никак не сдвинусь.
Спасибо.

Автор: Экскалупатор 27.9.2012, 21:39
Цитата(nvb @  27.9.2012,  08:12 Найти цитируемый пост)
С# такое приведение является безопасным...т.е. данные сохраняются каким то образом и к ним можно обратиться?

нужно явно привести к требуемому типу и тогда можно будет использовать эти поля.
Цитата(nvb @  27.9.2012,  08:12 Найти цитируемый пост)
И почему, собственно, обратное приведение небезопасно, тут-то данные точно не потеряются?

потому что тебе ничто не мешает создать объект базового типа и попытаться его привести к типу наследника и в итоге получить ошибку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)