一个关于索引器的问题 this[] VS get_Item()
今天无意中翻到chengbo的一篇面试随笔: 面试新蛋
题目看成了:如下代码能否编译成功
public int this[int index]
{
get { return 1;}
}
public int get_Item(int index)
{
return 1;
}
想想既然是这么问了,那肯定编译不过呢.理由,自己想想应该是因为编译器在将代码编译成IL的时候索引器this翻译为get_Item的.
自己在IDE里试了下,编译的错误提示果然是: "Error 1 Type 'WindowsTest.Form1 ' already defines a member called 'get_Item ' with the same parameter types ".如果是平时怕是根本想不到这个层面的.
不过话又说回来,编译器为什么要做这个限制的, 只是个名字翻译而已嘛.
再试了下Property,结果也是有这个限制的.
期待高手解惑
------解决方案--------------------保留的关键字吧
------解决方案--------------------也许是这些名字翻译就是固定死的呢
------解决方案--------------------肯定不行,看看.NET 框架程序设计就知道了
------解决方案--------------------呵呵………………
public int this[int index]
{
get { return 1;}
}
这个在编译时会修改成下面的样子:
public int get_Item(int index)
{
return 1;
}
所以,这不是限制,而是重复定义。
------解决方案--------------------唉,那么说就是固定死了呢...我觉得编译器完全能做的更智能一点,,难道微软认为没有必要?
不过出现这种情况肯定很少,谁会去定义一个 get_Item方法呢,,但这个限制看上去却又感觉不爽
这个不是限制,同一个类的两个方法肯定不能具有相同的签名,貌似1.1里面还是可以的,2.0把这个修复了。
倒不是因为微软不想智能,只是这样做与其它语言的兼容性就会更好,例如Java。微软可以自己发明一套Attribute来让这些可以任意取名,例如匿名方法的处理,但这样对其他不支持属性或索引器的语言就会造成困惑。