如何在 C# 中找到生成的 "indexer" 代码?

How do I find the generated "indexer" code in C#?

我已阅读Indexer docs and I know that indexer will be translate to generate a property named "Item". I want to inspect the generated code but I can't find the process function of compiler how to generate it. Source Code search of C#

在 C# 中,属性 getter 不接受任何参数,而 setter 只接受一个参数,因此编译器几乎不可能生成 C# 属性(在 C# 意义上)用于索引器。如果您希望找到 C# 代码声明 属性 称为 Item,您将找不到。

编译器生成的是 IL,这就是文档的意思 - IL 意义上的“属性”。 IL 具有索引属性,这就是索引器转换的内容。例如,像这样的索引器:

public class Foo
{
    public string this[int index]
    {
        get => "";
        set {}
    }
}

转换为(在 SharpLab 上玩这个!):

.method public hidebysig specialname 
    instance string get_Item (
        int32 index
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 6 (0x6)
    .maxstack 8

    IL_0000: ldstr ""
    IL_0005: ret
} // end of method Foo::get_Item

.method public hidebysig specialname 
    instance void set_Item (
        int32 index,
        string 'value'
    ) cil managed 
{
    // Method begins at RVA 0x2057
    // Code size 2 (0x2)
    .maxstack 8

    IL_0000: nop
    IL_0001: ret
} // end of method Foo::set_Item

// Properties
.property instance string Item(
    int32 index
)
{
    .get instance string Foo::get_Item(int32)
    .set instance void Foo::set_Item(int32, string)
}

请注意 Item 属性“采用参数”。还添加了一个 DefaultMemberAttribute(上面未显示)。

将最后一部分与普通 C# 属性转换为的内容进行比较:

.property instance string Item()
{
    .get instance string Foo::get_Item()
    .set instance void Foo::set_Item(string)
}

请注意,如果您将 IL 代码转换回 C#,您将取回索引器。 Indexed properties don't exist in C#.