“Item"属性以及索引器

本文关键字:索引 属性 Item quot | 更新日期: 2023-09-27 18:19:25

我已经阅读了带有索引器和属性名为"Item"的类的答案,但他们没有解释为什么我可以有多个索引器的类,它们都创建Item属性和get_Item/set_Item方法(当然工作得很好,因为它们是不同的重载),但我不能有一个显式的Item属性。

考虑以下代码:

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
        }
        public int this[string val]
        {
            get
            {
                return 0;
            }
            set
            {
            }
        }
        public string this[int val] //this is valid
        {
            get
            {
                return string.Empty;
            }
            set
            {
            }
        }
        public int Item { get; set; } //this is not valid
    }
}

为两个索引器创建了四个方法:

Int32 get_Item(String val)
Void set_Item(String val, Int32 value)
String get_Item(Int32 val)
Void set_Item(Int32 val, String value)
我希望我的属性创建
Int32 get_Item()
Void set_Item(Int32 value)

这些重载通常是可以接受的,但是编译器不允许我创建这样的属性。

请注意,我不需要一种方法来重命名索引器等,这是已知的-我需要一个解释。这个答案:https://stackoverflow.com/a/5110449/882200不能解释为什么我可以有多个索引器

“Item"属性以及索引器

与以下代码无法编译的原因相同:

public class Test
{
    public int Foo
    {
        get;
        set;
    }
    public void Foo()
    {
        return;
    }
}

上面的结果是"类型'Test'已经包含'Foo'的定义"。虽然这些可以通过Foo()方法和get_Foo()方法来实现,但命名是一个实现细节——在语言层面上,它是。Foo()和。Foo,因为不是所有语言都支持,编译器认为这是一个错误。

类似地,其他语言可能不支持索引器和属性具有相同的名称。因此,尽管您指出可以将编译为get_Item()和get_Item(Int32), CLR设计人员仍然选择不允许这样做。尽管CLR 可以被设计为允许这样做,但它可能在语言级别不被支持,因此他们选择避免任何此类问题。