Как на самом деле кастинги работают на уровне CLR?

Что происходит за кулисами во время подъема или опускания? У меня была идея, что когда я делаю что-то как:

string myString = "abc";
object myObject = myString;
string myStringBack = (string)myObject;

приведение в последней строке будет иметь единственной целью сообщить компилятору, что мы в безопасности, мы не делаем ничего плохого. Итак, у меня была идея, что на самом деле никакой код приведения не будет встроен в сам код. Кажется я ошибся

.maxstack 1
.locals init (
    [0] string myString,
    [1] object myObject,
    [2] string myStringBack)
L_0000: nop 
L_0001: ldstr "abc"
L_0006: stloc.0 
L_0007: ldloc.0 
L_0008: stloc.1 
L_0009: ldloc.1 
L_000a: castclass string
L_000f: stloc.2 
L_0010: ret 

Зачем CLR нужно что-то вродеcastclass string?

Есть две возможные реализации для downcast:

Вы требуетеcastclass something, Когда вы добираетесь до строки кода, которая делаетcastclass, CLR пытается сделать бросок. Но что случилось бы, если бы я пропустил строку строки castclass и попытался запустить код?Вам не требуетсяcastclass, Поскольку все ссылочные типы имеют одинаковую внутреннюю структуру, если вы попытаетесь использовать строку в экземпляре формы, она выдаст исключение неправильного использования (поскольку обнаруживает, что форма не является строкой или ее подтипами).

Кроме того, верно ли следующее состояние из C # 4.0 в двух словах?

Upcasting and downcasting between compatible reference types performs reference
conversions: a new reference is created that points to the same object.

Это действительно создает новую ссылку? Я думал, что это будет та же самая ссылка, только сохраненная в другом типе переменной.

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос