2010-08-23 3 views
1

Документации Инфраструктуры ECMA Common Language говорит это о КССЕ "isinst класс" инструкции:CIL инструкция "isinst <valuetype>"

Правильной CIL гарантирует, что класса является действительным TypeRef или ЬурейиМ или typespec маркера с указанием класса и , что obj всегда либо null, либо ссылка на объект.

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

IL_0001: isinst System.RuntimeTypeHandle

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

ответ

2

Посмотрите на объявления RuntimeTypeHandle:

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

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

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

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

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

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

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

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

var b = i is int; 

Надеюсь, это может способствовать некоторому уточнению этой темы.

+0

Другими словами, «isinst » действительно означает «isinst »? – TonyK

+0

@TonyK - я считаю, что это правильно - обратите внимание, что указанная вами часть спецификации указывает, что _obj_ должен быть нулевым или ссылкой на объект, поэтому для него не имеет смысла быть типом unboxed value. – kvb

+0

На самом деле 'is int' переводится на' isinst int32'. В Reflector 'int32' можно щелкнуть и ссылки на' System.Int32'. То же самое с другими типами значений, такими как 'bool'. – Andreas

Смежные вопросы