此代码无法验证:
.assembly extern mscorlib {}
.assembly Program {}
.method private static void Main() cil managed
{
.entrypoint
.maxstack 3
.locals init ( int32[0 ... 10] a )
ldc.i4 10
newarr int32
stloc.0
ldloc.0
ldc.i4.0
ldc.i4.s 32
stelem.i4
call string [mscorlib]System.Console::ReadLine()
pop
ret
}有以下错误:
IL: Error: C:[.]Program.exe:主期望的单维数组。1验证Program.exe的错误
然而,这段代码验证得很好:
.assembly extern mscorlib {}
.assembly Program {}
.method private static void Main() cil managed
{
.entrypoint
.maxstack 3
.locals init ( int32[] a )
ldc.i4 10
newarr int32
stloc.0
ldloc.0
ldc.i4.0
ldc.i4.s 32
stelem.i4
call string [mscorlib]System.Console::ReadLine()
pop
ret
}这是一个未实现的特性,是CLR或PEVerify中的错误,还是仅仅是对使用的误解?程序都执行得很好。
发布于 2011-12-23 02:47:01
我的猜测--这只是猜测--这与向量和数组之间的区别有关。
ECMA CLI规范 (Partition,第14.1和14.2节)这样说:
向量是具有零下界的一维数组.它们直接支持CIL指令(
newarr、ldelem、stelem和ldelema)。 ..。 当向量通过CIL指令直接支持时,所有其他数组都通过创建抽象类System.Array的子类型得到VES的支持。
向量是使用T[]语法声明的,而数组可以使用T[n]、T[p,q]、T[x...y]等多种方式声明。因此,在第一个示例中,int32[0 ... 10]语法是一个数组声明。在第二个示例中,int32[]语法是一个向量声明。
我的猜测是,验证器将对象指向第一个示例,因为它认为您试图在数组而不是向量上使用newarr和stelem。据推测,验证者只是在检查声明的类型,而不考虑数组的级别、界限等。这两个示例正确执行的原因是,对于所有意图和目的而言,具有零下限的一维数组都是向量。
至于为什么错误信息说“期望的一维数组”而不是“期望的向量”,我不知道!
https://stackoverflow.com/questions/8610224
复制相似问题