“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不能解释为什么我可以有多个索引器
与以下代码无法编译的原因相同:
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 可以被设计为允许这样做,但它可能在语言级别不被支持,因此他们选择避免任何此类问题。