在数组中无法比较两个元素。

4
private SortedList<ToolStripMenuItem, Form> forms = new SortedList<ToolStripMenuItem, Form>();                

private void MainForm_Load(object sender, EventArgs e)
{
   formsAdd(menuCommandPrompt, new CommandPrompt());
   formsAdd(menuLogScreen, new LogScreen()); //Error
}

private void formsAdd(ToolStripMenuItem item, Form form)
{
   forms.Add(item, form); //Failed to compare two elements in the array.
   form.Tag = this;
   form.Owner = this;
}

我不明白为什么它会出现错误。错误发生在表单加载事件的第二行。

formsAdd方法只是将表单和工具提示元素添加到数组(forms)中,并将表单的标签和所有者设置为这个。在第二次调用该函数时,它会抛出一个错误。

CommandPrompt, LogScreen /* are */ Form //s
menuCommandPrompt, menuLogScreen /* are */ ToolStripMenuItem //s

Error


请提供异常详细信息。看起来您创建了一个 ToolStripMenuItem 的排序列表,但没有提供比较它们的方法,这使得排序变得困难。 - Raymond Chen
2个回答

10

你有一个SortedList,但是ToolStripMenuItem没有实现IComparable接口,所以列表不知道如何对它们进行排序。

如果你不需要对项目进行排序,可以使用一个TupleDictionary列表,具体取决于你想要做什么。

如果你想要对其进行排序,你需要使用接收IComparer的SortedLists构造函数重载。这意味着你必须以某种方式实现该接口。


看来我有很多工作要做... 我使用这种方法的原因是我简单地创建了一个函数,实现了所有我的ToolStripMenuItem的点击事件。我获取发送者信息,然后打开与菜单项相关联的表单。 - haxxoromer
使用 Dictionary 可能是最好的选择。 - svick
由于某些原因,我必须通过索引的值来获取SortedList的索引。在Directories中这是不可能的。(我认为是这样) - haxxoromer

2

您的两种对象类型都实现了IComparable接口吗?这是对于排序列表比较其添加到数组中的对象来说必须的。


我不知道IComparable是什么东西... =D 而且也不知道该如何处理这个东西。 - haxxoromer
只有关键对象需要实现 IComparable 接口。而问题说明了关键对象是 ToolStripMenuItem,但它并没有实现该接口。 - svick
@svick 是的,我在乘坐缓慢的移动连接的列车上匆忙输入。感谢您发布更完整的答案。 - Frazell Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接