超载索引器不工作
本文关键字:工作 索引 超载 | 更新日期: 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