根据 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
}
我误解了规范吗?