Посмотрите декларацию 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;
Я надеюсь, что это может внести некоторые разъяснения по этой теме.