`
ravenex
  • 浏览: 10953 次
  • 性别: Icon_minigender_1
  • 来自: 体育仓库
社区版块
存档分类
最新评论

.NET类型的全限定名称不表现variance

    博客分类:
  • .NET
阅读更多
链接:装配脑袋:手工解析.NET完全限定类型名称

想起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对识别类型不重要,所以不必包括在名字里。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics