5

我已经阅读了Class with indexer and property named "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没有解释为什么我可以有多个索引器。

4

1 回答 1

4

出于同样的原因,以下内容将无法编译:

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本来可以设计为允许这样做,但它可能在语言级别不受支持,因此他们选择避免​​任何此类问题。

于 2013-06-20T14:25:40.110 回答