以下代码是面向对象的C#脚本的一部分,我收到了错误:
An unhandled exception of type 'System.StackOverflowException' occurred in script.exe
我发现这特别奇怪,因为我无法找到任何可能与我程序逻辑中无限发生的某种形式的过程有关的事情。
它会一直作为我为Coordinates类所做的operator !=
的一部分而发生,只要它被用作应该返回Dictionary.ContainsKey()
的{{1}}的参数。
这是坐标类:
true
只要class Coordinate
{
private int _x;
private int _y;
public int X
{
get
{
return _x;
}
}
public int Y
{
get
{
return _y;
}
}
public Coordinate(Random r)
{
this._x = r.Next(79);
this._y = r.Next(24);
}
public Coordinate(int x, int y)
{
this._x = x;
this._y = y;
}
public static Coordinate operator +(Coordinate a, Coordinate b)
{
return new Coordinate(a.X + b.X, a.Y + b.Y);
}
public static bool operator ==(Coordinate a, Coordinate b)
{
return ((a != null && b != null) && (a.X == b.X && a.Y == b.Y)) || (a == null && b == null);
}
public static bool operator !=(Coordinate a, Coordinate b)
{
return a != null && b != null && (a.X != b.X || a.Y != b.Y) || (a == null && b != null) || (a != null && b == null);
}
public override int GetHashCode()
{
return this.X.GetHashCode() * 23 + this.Y.GetHashCode() * 17;
}
public override bool Equals(object obj)
{
Coordinate other = obj as Coordinate;
return other != null && other.X == this.X && other.Y == this.Y;
}
}
应该返回_positions.ContainsKey(position)
,这就是始终导致错误的代码:
true
该程序的这一部分的目标是查看特定的Coordinate是否在所显示的字典中具有相等的X和Y值的对应物。我发现除非我覆盖了private bool OutOfRangeCheck(Coordinate position)
{
return position.X < 1 || position.X > 10 || position.Y < 1 || position.Y > 10;
}
private bool PositionConflictCheck(Coordinate position)
{
bool temp = _positions.ContainsKey(position);
return OutOfRangeCheck(position) || _positions.ContainsKey(position);
}
和GetHashCode()
方法,否则这不会起作用。
如果有帮助,当查看错误被抛出时的局部变量时,&#39; a&#39; Equals()
方法中的坐标列为operator !=(Coordinate a, Coordinate b)
,旁边有一个红色的X.
非常感谢任何帮助。
答案 0 :(得分:4)
您正在覆盖equals运算符(==)并在那里使用equals运算符。
a != null && b != null
如果您想要与null进行比较,请不要使用您的操作符,先将其强制转换为对象,例如(object)a != null
或使用object.ReferenceEquals(a, null)
。
这也适用于您的非等于运算符,即使Dictionary.ContainsKey
未使用它。