此代码验证失败:
.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]:错误:[C:[...] Program.exe ::: Main] [offset 0x0000000F]预期的单维数组。 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中的错误,还是仅仅是对使用的误解?程序都执行得很好。
答案 0 :(得分:3)
我的猜测 - 这只是猜测 - 这与矢量和数组之间的区别有关。
ECMA CLI Specification(第二部分,第14.1和14.2节)说:
向量是具有零下限的单维数组。他们 在CIL说明中有直接支持(
newarr
,ldelem
,stelem
, 和ldelema
)。[...]
虽然向量通过CIL指令直接支持所有其他指令 VES通过创建抽象的子类型来支持数组 班
System.Array
。
使用T[]
语法声明向量,而使用T[n]
,T[p,q]
,T[x...y]
等可以通过各种方式声明数组。所以,在第一个示例中, int32[0 ... 10]
语法是数组声明。在第二个示例中,int32[]
语法是 vector 声明。
我的猜测是,验证程序会反对您的第一个示例,因为它认为您尝试在数组而不是上使用newarr
和stelem
>矢量。据推测,验证者只是检查声明的类型,并没有考虑数组的等级,界限等。两个示例正确执行的原因是因为具有零下界的零的一维数组是一个向量,用于所有意图和目的。
至于为什么错误信息显示“预期的单维数组”而不是“预期的矢量”,我不知道!