C# can'指数;在列表中找不到最后一个元素

C# can'指数;在列表中找不到最后一个元素,c#,indexof,C#,Indexof,为什么IndexOf找不到此代码的列表中的最后一个元素 public List<Rule> rules = new List<Rule>(); Rule n = new Rule(); rules.Add(n); Console.WriteLine(n == rules.Last<Rule>()); //True dg_main.SelectedIndex = rules.IndexOf(n); //-1 公共列表规则=新列表(); 规则

为什么
IndexOf
找不到此代码的
列表中的最后一个元素

  public List<Rule> rules = new List<Rule>();
  Rule n = new Rule();
  rules.Add(n);
  Console.WriteLine(n == rules.Last<Rule>()); //True
  dg_main.SelectedIndex = rules.IndexOf(n); //-1
公共列表规则=新列表();
规则n=新规则();
规则。添加(n);
Console.WriteLine(n==rules.Last())//真的
dg_main.SelectedIndex=rules.IndexOf(n)//-1.
回答: 谢谢大家抽出时间。 我对当时的情况非常困惑,甚至没有意识到这不是IndexOf的错。 是dg_main.SelectedIndex更改了索引。DataGrid已排序。

如图所示,IndexOf使用EqualityComparer的.Equals方法,该方法使用EqualityComparer.Default,从而生成比较器。如您所见,它使用.Equals方法,而不是相等运算符

这样做的一个重要原因是,与所有运算符一样,相等运算符是静态的,因此除非编译器在编译时具有正确的类型,否则不能正确调用所需的运算符

这里最简单的解决方法是实现.Equals并使其调用相等比较器

// Equals overload for Rule objects
public bool override Equals(object obj)
{
    if(obj is Rule)
        return (Rule)obj == this; // Type cast here to ensure the right equality operator is called
    else return base.Equals(obj);
}

我认为代码中没有显示的部分有错误,因为下面的代码是正确的:

[Test, Explicit]
public void Test()
{
  List<Rule> rules = new List<Rule>();
  Rule n = new Rule();
  rules.Add(n);
  Assert.AreEqual(n , rules.Last());
  Assert.AreEqual(0, rules.IndexOf(n));
}
[测试,显式]
公开无效测试()
{
列表规则=新列表();
规则n=新规则();
规则。添加(n);
arest.AreEqual(n,rules.Last());
aresequal(0,rules.IndexOf(n));
}

IndexOf使用EqualityComparer(然后最终覆盖Object.Equals()或默认实现)。==操作员可能不同。规则类的代码是什么?能否突出显示哪些代码段一起运行?我知道您最初在第1行和其他行之间张贴了一个空格,因为您不能有一个公共局部变量,这可能是您试图指示第1行在一个地方,其余的行在其他地方?一个简短但完整的示例,我们可以复制并粘贴到(比如)控制台项目中,这会很有帮助。