链接:装配脑袋:[url=http://www.cnblogs.com/Ninputer/archive/2009/08/27/typename_parser.html]手工解析.NET完全限定类型名称[/url]
想起CLR 2.0开始支持variance,在MSIL里声明泛型接口或者委托时可以在泛型参数前加上+或者-来表示covariance和contravariance。全限定名称里包含了泛型参数的信息,感觉也应该包含variance信息。
实验如下:
结果:
IFoo`1[T]
Foo`1[System.Int32]
IFoo`1[System.Int32]
IFoo<>也没有显示出定义时的加号。看来variance对识别类型不重要,所以不必包括在名字里。
想起CLR 2.0开始支持variance,在MSIL里声明泛型接口或者委托时可以在泛型参数前加上+或者-来表示covariance和contravariance。全限定名称里包含了泛型参数的信息,感觉也应该包含variance信息。
实验如下:
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
.assembly variance
{
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module variance.exe
.class interface public abstract auto ansi IFoo`1<+T>
{
}
.class public auto ansi beforefieldinit Foo`1<T>
extends [mscorlib]System.Object
implements class IFoo`1<!T>
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
}
}
.class private abstract auto ansi sealed beforefieldinit Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (class Foo`1<int32> V_0,
class [mscorlib]System.Type[] V_1,
class [mscorlib]System.Type V_2,
class [mscorlib]System.Type[] V_3,
int32 V_4,
bool V_5)
IL_0000: nop
IL_0001: ldtoken IFoo`1
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: newobj instance void class Foo`1<int32>::.ctor()
IL_0016: stloc.0
IL_0017: ldloc.0
IL_0018: call void [mscorlib]System.Console::WriteLine(object)
IL_001d: nop
IL_001e: ldloc.0
IL_001f: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
IL_0024: callvirt instance class [mscorlib]System.Type[] [mscorlib]System.Type::GetInterfaces()
IL_0029: stloc.1
IL_002a: nop
IL_002b: ldloc.1
IL_002c: stloc.3
IL_002d: ldc.i4.0
IL_002e: stloc.s V_4
IL_0030: br.s IL_0046
IL_0032: ldloc.3
IL_0033: ldloc.s V_4
IL_0035: ldelem.ref
IL_0036: stloc.2
IL_0037: nop
IL_0038: ldloc.2
IL_0039: call void [mscorlib]System.Console::WriteLine(object)
IL_003e: nop
IL_003f: nop
IL_0040: ldloc.s V_4
IL_0042: ldc.i4.1
IL_0043: add
IL_0044: stloc.s V_4
IL_0046: ldloc.s V_4
IL_0048: ldloc.3
IL_0049: ldlen
IL_004a: conv.i4
IL_004b: clt
IL_004d: stloc.s V_5
IL_004f: ldloc.s V_5
IL_0051: brtrue.s IL_0032
IL_0053: ret
}
}
结果:
IFoo`1[T]
Foo`1[System.Int32]
IFoo`1[System.Int32]
IFoo<>也没有显示出定义时的加号。看来variance对识别类型不重要,所以不必包括在名字里。