我有一个自定义集合,我想重载索引器。我的问题是,即使签名不同,我也会收到编译时错误。
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],但我真的很喜欢它非常新手友好。谢谢。
编辑 LineNumber
是enum
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;
}
}
}
编辑:我很遗憾浪费每个人的时间。我发现了我的问题,这是一个愚蠢的错误。我刚刚开始通过阅读来教自己。发生了什么是持有该集合的类没有正确实现索引器。遗憾。
答案 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