设置ListView.ItemsSource时的StackOverflow

Jou*_*aas 3 c# stack-overflow wpf

所以我有一个简单的结构,Point有两个双打XY.我计算了一个大约三百个数组的数组,并将该数组设置为WPF中ListView的ItemsSource.那个电话最终会抛出一个StackOverflowException.

De调试器Equals在我的struct 中的方法开头打破了,我实现的就是这样(应该重要):

public override bool Equals(object obj)
{
  if (obj is Point)
    return Equals(obj);

  return false;
}
public bool Equals(Point other)  // Implement IEquatable<T>
{
  return this.x == other.x && this.y == other.y;
}
Run Code Online (Sandbox Code Playgroud)

如果我改变它:

public override bool Equals(object obj)
{
  return false;
}
Run Code Online (Sandbox Code Playgroud)

什么都没发生,数字显示出来.我真的不知道我在这里做错了什么,所以我不知道如何解决这个问题.有什么指针吗?

Bol*_*ock 6

该程序试图Equals(object obj)再次打电话,因为即使它obj是一个object即使你正在传递Point.所以从根本上来说,重载一次又一次地呼唤着自己

当你在内部调用中传递它时,你必须转换objPoint,所以它将调用该Equals(Point other)方法:

public override bool Equals(object obj)
{
  if (obj is Point)
    return Equals((Point) obj);

  return false;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

快速 - 编写Equals(对象)方法的另一种方法是:

public override bool Equals(object obj)
{
    return (obj is Point) && Equals((Point)obj);
}
Run Code Online (Sandbox Code Playgroud)

(第一组括号实际上不是必需的,但我认为它有助于提高可读性.)