В чем разница между приведением и преобразование типов?
Не могу понять
Правда, преобразование несовместимых типов все-таки может быть осуществлено путем приведения. Приведение типов, по существу, означает явное их преобразование. (из книги)
Получается приведение и есть преобразование?
Ответы (1 шт):
Преобразование типов
Значение типа T1 изменяется так, что бы стать значением типа T2. Так например преобразование из int во float требует выделение битов под положение точки в значении. Или же при преобразовании int в string необходимо получить коды символов, которые бы отражали записанное значение в int.
Приведение типов
Объект с типом T1 выражен через переменную T2, при этом структура объекта не меняется. Так например у нас имеется T1 : T2, где T1 - дочерний элемент, а T2 - родительский. Когда мы прописываем
T2 someVariable = new T1()
Мы выделяем в памяти место для нового типа T1, однако данные в этом типе устроены так, что бы этот тип можно было прочитать так же, как и T2 не изменяя сами данные.
Пример:
Допустим у нас есть 2 класса:
class A {
int aValue;
}
class B : A {
int bValue
}
Тогда инициализация этих объектов в памяти будет выглядеть так:
var a = new A() // [..., int<aValue>, ...]
var b = new B() // [..., int<aValue>, int<bValue>, ...]
При этом a и b это указатели на первый элемент данных
Таким образом если мы сделаем
A b_as_a = b
То внутренняя структура объекта не изменится, но мы будем всё так же иметь доступ к первому значению int<aValue>, ведь его сдвиг относительно начала объекта для всех дочерних объектов будет одинаковый
Подробнее прочитать про даункаст (приведение дочернего типа к родительскому) можно здесь
P. S.: Разумеется на практике всё работает немного сложнее, чем я описал сейчас, но этого достаточно что бы понять общую концепцию