今天模仿着做一个IList类,是用Reflector看着System.Web.UI.WebControls.ListItemCollection做的。IList要求实现object this[int index]{get;set;},然而我看到ListItemCollection是通过如下方法实现固定返回类型的:(这是Reflector提供的C#代码)
void IList.set_Item(int index, object value)
{
      this.listItems[index] = (ListItem) value;
}
 
public ListItem this[int index]
{
      get
      {
            return (ListItem) this.listItems[index];
      }
}
 
然而我模仿着这样去做,却无法通过编译,为什么呢?难道.NET Framework使用的编译器比我们的要宽松,甚至它直接写IL的?

解决方案 »

  1.   

    1.C#中this属性默认是Item属性,编译成get_Item和set_Item方法。你可以添加DefaultMemberAttribute改变this映射到其它属性。
    2.返回值重载可以用显示接口实现的技巧实现。
    object IList.this[int index]
    {
    get}public ListItem this[int index]
    {
    }
      

  2.   

    object IList.this[int index]
    {
        get
        {
            return this[index]
        }
    }public ListItem this[int index]
    {
    }
      

  3.   

    接口显式实现啊.也可以从CollectionBase继承
      

  4.   

    那为什么public ListItem this[int index]就能够隐藏掉上面的object IList.this[int index].get?另外为什么那么多.NET Framework里面实现IList的类不直接从CollectionBase继承,而是自己重写所有的接口?