Как на самом деле кастинги работают на уровне 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.
Это действительно создает новую ссылку? Я думал, что это будет та же самая ссылка, только сохраненная в другом типе переменной.
Спасибо