Инструкция CIL "isinst <valuetype>" - PullRequest
       1

Инструкция CIL "isinst <valuetype>"

1 голос
/ 24 августа 2010

В документации инфраструктуры общего языка ECMA говорится об инструкции CIL "isinst class ":

Правильный CIL гарантирует, что class является допустимым токеном typeref, typedef или typepec, указывающим класс, и что obj всегда является либо нулевым, либо ссылкой на объект.

Это означает, что тип оценки недопустим, верно? Но mscorlib.dll содержит метод System.RuntimeTypeHandle :: Equals (object obj) со следующей инструкцией:

IL_0001: isinst System.RuntimeTypeHandle

И System.RuntimeTypeHandle является типом значения. Кто-нибудь может поставить меня прямо здесь?

1 Ответ

2 голосов
/ 24 августа 2010

Посмотрите декларацию RuntimeTypeHandle:

.class public sequential ansi serializable sealed beforefieldinit RuntimeTypeHandle
    extends     System.ValueType
    implements  System.Runtime.Serialization.ISerializable

Хотя RuntimeTypeHandle объявлено как структура, его представление в CIL является своего рода специальным классом. Другими словами, вы можете представить структуры как специальные классы, которые наследуются от System.ValueType и чьи атрибуты следуют строгому порядку.

Имея это в виду, isinst будет вызываться с RuntimeTypeHandle. То, что я интерпретирую, isinst вообще не ограничивается ссылочными типами, пока существует класс, представляющий тип.

Допустим, мы пишем на C #:

var i = 4;
var b = i is Int32;

Мы получаем предупреждение компилятора

Предупреждение: данное выражение всегда имеет предоставленный ('int') тип.

Что происходит? Мы присваиваем 4 i. i становится int. На следующей строке i автоматически упаковывается в соответствующий ReferenceType (класс), так что предупреждение очевидно. Мы могли бы даже написать

var b = i is int;

Я надеюсь, что это может внести некоторые разъяснения по этой теме.

...