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

本文探讨了.NET中泛型接口及委托的变异性(covariance和contravariance),通过MSIL代码示例展示了如何在全限定类型名称中体现变异性,并通过实验验证了全限定名称并未显示变异性符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:装配脑袋:[url=http://www.cnblogs.com/Ninputer/archive/2009/08/27/typename_parser.html]手工解析.NET完全限定类型名称[/url]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值