2010-08-23 59 views
1

的ECMA通用語言基礎文件說,這對CIL「isinst 」指令:CIL指令「isinst <valuetype>」

正確CIL確保是一個有效的typeref或類型定義或類型指定令牌表示一個類,而 表示obj總是爲空或對象引用。

這意味着不允許使用valuetype,對不對?但mscorlib.dll中包含的方法System.RuntimeTypeHandle ::等於(obj對象)下面的指令:

IL_0001:isinst System.RuntimeTypeHandle

而且System.RuntimeTypeHandle是值類型。任何人都可以把我放在這裏嗎?

回答

2

看一看的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; 

我們得到一個編譯器警告

警告:給定的表情總是的提供( '詮釋')型。

會發生什麼情況?我們將4分配給ii becoms an int。在下一行i被自動裝箱到相應的ReferenceType(班),所以警告是顯而易見的。我們甚至可以寫

var b = i is int; 

我希望這可以有助於這方面的某種清理。

+0

換句話說,「isinst 」的真正含義是「isinst 」? – TonyK 2010-08-24 09:05:31

+0

@TonyK - 我相信這是正確的 - 請注意,您引用的規範部分表明,_obj_必須爲null或對象引用,因此將它視爲未裝箱的值類型是沒有意義的。 – kvb 2010-08-24 16:45:42

+0

實際上,'int'被轉換爲'isinst int32'。在Reflector中,可以單擊「int32」並引用System.Int32。與其他值類型相同,如'bool'。 – Andreas 2010-08-24 19:30:31