超载索引器不工作

本文关键字:工作 索引 超载 | 更新日期: 2023-09-27 18:07:17

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

        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);

错误如下:

ERROR最佳的重载方法匹配'XXX. header .this[XXX. XXX.]LineNumber]'有一些无效参数

错误参数'1':无法从'int'转换为'XXX '。LineNumber '

我开始认为你不能重载一个索引器多次?或者我做错了什么,这不起作用。我知道变通如XXX.Header[(LineNumber)myIntegerValue],但我真的希望它是非常新手友好。谢谢你。

EDIT LineNumber是一个enum

长编辑这是我的自定义集合类(抱歉,如果太长,我不知道什么是必要的)

   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;
       }
        
   }

}

EDIT:很抱歉浪费了大家的时间。我发现了我的问题,这是一个愚蠢的错误。我刚刚开始通过阅读自学。发生的情况是持有集合的类没有正确实现索引器。对不起。

超载索引器不工作

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

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"];
    }
}

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

这里是一个例子,再次显示了多个索引器,但也显示了它做enum转换像你正在做的,它工作,你可以复制并粘贴到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