我已经阅读了Class with indexer and property named "Item"的答案,但是他们没有解释为什么我可以拥有一个包含多个索引器的类,所有这些都创建了Item
属性和get_Item
/ {{ 1}}方法(当然效果很好,因为它们是不同的重载),但我不能有明确的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)
这些重载通常是可以接受的,但不知何故,编译器不会让我创建这样的属性。
请注意,我不需要重命名索引器等方法,这是已知的 - 我需要一个解释。这个答案:https://stackoverflow.com/a/5110449/882200没有解释为什么我可以拥有多个索引器。
答案 0 :(得分:4)
出于同样的原因,以下内容无法编译:
public class Test
{
public int Foo
{
get;
set;
}
public void Foo()
{
return;
}
}
以上结果“类型'测试'已包含'Foo'的定义”。虽然这些可以实现为Foo()方法和get_Foo()方法,但命名是一个实现细节 - 在语言级别,它是.Foo()和.Foo,因为并非所有语言都支持它,编译器会考虑这是一个错误。
同样,其他语言可能不支持拥有索引器和具有相同名称的属性。所以,虽然你指出这个可以编译为get_Item()和get_Item(Int32),但CLR设计者却选择不允许它。尽管CLR 可以设计为允许这样做,但在语言层面可能不支持它,因此他们选择避免任何此类问题。