У меня была идея, что на самом деле не будет вставлен код приведения
в самом коде.
Интересная идея. Как вы представили, что это сработало?
try
{
object x = 123;
object y = (string)x;
}
catch(InvalidCastException ex)
{ ... }
Если приведение не дает кода, тогда , где происходит код, который выдает исключение ?
Помните, что основная цель приведения типа от менее определенного к более конкретному типу - выполнить проверку типа во время выполнения .
Как только проверка типа пройдена, тогда, конечно, больше ничего не должно произойти. Биты ссылки перед проверкой типа и биты после проверки типа являются одинаковыми битами; мы только что во время выполнения проверили, оправдано ли новое использование старых битов.
если вы попытаетесь использовать строку в экземпляре формы, она выдаст исключение неправильного использования (поскольку обнаруживает, что форма не является строкой или ее подтипами).
Где это обнаруживается? Я имею в виду, в какая именно инструкция обнаружена? В инструкции CastClass . Вот для чего предназначена инструкция castclass.
что бы произошло, если бы я пропустил строку строки castclass и попытался запустить код?
Верификатор безопасности типов отклонил бы вашу программу. Если бы вы заставили CLR запускать его без прохождения проверки, тогда у него было бы неопределенное поведение. Возможно, он преуспел, мог произойти сбой, возможно, он отформатировал ваш жесткий диск.
Действительно ли это создает новую ссылку?
Помните, что на уровне реализации ссылка - это просто целое число размером с указатель. Это число, которое менеджер памяти может использовать для отслеживания позиции упомянутых данных. Это может быть указатель, это может быть ручка, не имеет значения, что это такое; это то, что реализует абстрактное понятие ссылки.
Если у вас есть переменная, которая содержит 12, и вы «заменяете» ее содержимое на 12, это «новый» 12, который только что был создан, или это «старый» 12? Предположим, вы создали вторую переменную и в нее тоже поместили 12, скопировав из первой переменной. Это «новый» 12 или «старый» 12? Как вы можете сказать? Это разница, которая не имеет значения. Когда вы создаете «новую» ссылку, идентичную «старой» ссылке, создается ли что-то новое? Вопрос философский, а не технический.