1

根据 CLR ECMA 标准文档的第 196 页,以下是用于定义类属性 getter 的 MSIL 语法。

.get CallConv Type [ TypeSpec ‘::’ ] MethodName ‘(’ Parameters ‘)’

.get 指定此属性的 getter。TypeSpec 默认为当前类型。一个属性只能指定一个 getter。为了符合 CLS,getter 的定义应标记为 specialname。

请注意上面的粗体部分,以及 TypeSpec '::' 在 [] 内的事实

所以我认为这意味着我应该能够在课堂上做到这一点:

   .property instance int32 'Top'()
   {
     .get instance int32  get_Top()
     .set instance void   set_Top(int32)
   }

然而, ilasm 不接受,抱怨道:

错误:未解析的全局成员引用“get_Top”错误:未解析的全局成员引用“set_Top”

它只接受 Stack`1::get_Top():

完整的属性 + 方法如下所示:

.class public ansi Stack`1<T>  
{
   .field public int32 'top'

   .property instance int32 'Top'()
   {
     .get instance int32 Stack`1::get_Top()
     .set instance void  Stack`1::set_Top(int32)
   }

   .method public hidebysig specialname instance int32 get_Top() cil managed
   {
     ldarg.0
     ldfld int32 class Stack`1<!T>::'top'
     ret
   }

   // snip
}

我误解了规范吗?

4

0 回答 0