重载索引器不起作用

时间:2011-09-02 20:11:55

标签: c# collections indexing this

我有一个自定义集合,我想重载索引器。我的问题是,即使签名不同,我也会收到编译时错误。

        public HeaderLine this[LineNumber lineNum]
       {
           get
           {
               return (HeaderLine)InnerList[(int)lineNum - 1];
           }
            set
            {
                InnerList[(int)lineNum] = (HeaderLine)value;
            }
        }


        public HeaderLine this[int lineNum]
        {
            get
            {
                return (HeaderLine)InnerList[lineNum - 1];
            }
            set
            {
                InnerList[lineNum - 1] = (HeaderLine)value;
            }
        }
    }

当我只是尝试实现这个时:

MessageBox.Show(myDatafile.Header[3].Description);

这些是错误:

  

错误“XXX.Header.this [XXX.LineNumber]”的最佳重载方法匹配包含一些无效参数

     

ERROR 参数'1':无法从'int'转换为'XXX.LineNumber'

我开始认为你不能多次超载索引器?或者我做错了什么不起作用。 我知道的工作,例如XXX.Header [(LineNumber)myIntegerValue],但我真的很喜欢它非常新手友好。谢谢。

编辑 LineNumberenum

LONG EDIT 这是我的自定义集合类(对不起,如果太久我不知道有什么必要)

   namespace XXX
   {
     public class HeaderLines : CollectionBase
     {
       public void Add(HeaderLine newHeaderLine)
       {
           List.Add((HeaderLine)newHeaderLine);
       }

       public void Remove(HeaderLine newHeaderLine)
       {
           List.Remove((HeaderLine)newHeaderLine);
       }

       public HeaderLine this[LineNumber lineNum]
       {
           get
           {
               return (HeaderLine)InnerList[(int)lineNum - 1];
           }
           set
           {
               InnerList[(int)lineNum] = (HeaderLine)value;
           }   
       }

       public HeaderLine this[int lineNum]
       {
           get
           {
               return (HeaderLine)InnerList[lineNum - 1];
           }
           set
           {
               InnerList[lineNum - 1] = (HeaderLine)value;
           }
       }
   }

}

namespace XXX
{
   public class HeaderLine
   {

       public string Description { get; set; }

       public override string ToString()
       {
           return Description;
       }

   }

}

编辑:我很遗憾浪费每个人的时间。我发现了我的问题,这是一个愚蠢的错误。我刚刚开始通过阅读来教自己。发生了什么是持有该集合的类没有正确实现索引器。遗憾。

2 个答案:

答案 0 :(得分:2)

你绝对可以重载索引器(而且很多系统类型都这样做)。这是一个没有问题编译的例子:

using System;

class Foo
{
    public string this[string text]
    {
        get { return text; }
    }

    public int this[int number]
    {
        get { return number; }
    }
}

class FooHolder
{
    public Foo Foo { get; set; }
}

class Test
{
    static void Main()
    {
        var holder = new FooHolder { Foo = new Foo() };

        int x = holder.Foo[10];
        string y = holder.Foo["hello"];
    }
}

看看你是否可以提出一个类似的简短但完整的程序失败,我们可以找出原因。目前有太多未知因素可以轻松诊断问题。

答案 1 :(得分:0)

下面是一个示例,它再次显示了多个索引器,但也显示它正在执行枚举转换,就像您正在做的那样有效,您可以将其复制并粘贴到LinqPad中以运行它。

我们需要有关您的代码的更多信息。

public void Main()
{
    DaClass thing = new DaClass();

    Console.WriteLine(thing[1]);
    Console.WriteLine(thing[Magic.Two]);


}

public class DaClass
{
    private List<string> stuff = new List<string>{"Item1", "Item2", "Item3", "Item4"};
    public string this[Magic m]
    {
        get{return stuff[(int)m];}
        set{stuff[(int)m] = value;}
    }

    public string this[int i]
    {
        get{return stuff[i];}
        set{stuff[i] = value;}
    }
}
//Results
//Item2
//Item3