日期:2014-05-19  浏览次数:20904 次

一个关于索引器的问题 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来让这些可以任意取名,例如匿名方法的处理,但这样对其他不支持属性或索引器的语言就会造成困惑。