首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PEVerify说CLR需要一个静态大小数组的一维数组?

为什么PEVerify说CLR需要一个静态大小数组的一维数组?
EN

Stack Overflow用户
提问于 2011-12-22 22:03:23
回答 1查看 188关注 0票数 3

此代码无法验证:

代码语言:javascript
复制
.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的错误

然而,这段代码验证得很好:

代码语言:javascript
复制
.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中的错误,还是仅仅是对使用的误解?程序都执行得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-23 02:47:01

我的猜测--这只是猜测--这与向量和数组之间的区别有关。

ECMA CLI规范 (Partition,第14.1和14.2节)这样说:

向量是具有零下界的一维数组.它们直接支持CIL指令(newarrldelemstelemldelema)。 ..。 当向量通过CIL指令直接支持时,所有其他数组都通过创建抽象类System.Array的子类型得到VES的支持。

向量是使用T[]语法声明的,而数组可以使用T[n]T[p,q]T[x...y]等多种方式声明。因此,在第一个示例中,int32[0 ... 10]语法是一个数组声明。在第二个示例中,int32[]语法是一个向量声明。

我的猜测是,验证器将对象指向第一个示例,因为它认为您试图在数组而不是向量上使用newarrstelem。据推测,验证者只是在检查声明的类型,而不考虑数组的级别、界限等。这两个示例正确执行的原因是,对于所有意图和目的而言,具有零下限的一维数组都是向量。

至于为什么错误信息说“期望的一维数组”而不是“期望的向量”,我不知道!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8610224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档