C#在泛型列表中使用Equals方法失败
我有一个项目,我有使用模板的类状态。 我有一个类单元格,我使用它作为状态,所以状态保存一个单元格作为genericState。 现在我有一个通用函数,它检查两个实例是否相等。 问题是,它从不将State Equals方法留给Cell Equals方法C#在泛型列表中使用Equals方法失败,c#,templates,generics,equals,C#,Templates,Generics,Equals,我有一个项目,我有使用模板的类状态。 我有一个类单元格,我使用它作为状态,所以状态保存一个单元格作为genericState。 现在我有一个通用函数,它检查两个实例是否相等。 问题是,它从不将State Equals方法留给Cell Equals方法 public class State<T> { public T genericState; //in my case T is a cell public State(T cellState) // CTOR
public class State<T>
{
public T genericState; //in my case T is a cell
public State(T cellState) // CTOR
{
this.genericState = cellState;
}
public override bool Equals(object obj)
{
return genericState.Equals((obj as State<T>).genericState);
} //never leaves
}
我不明白为什么它永远都不能达到相等的单元法。代码可能有什么问题
genericState.Equals
是从对象
派生的相等方法。在您的Cell
类中,您没有重写object.Equals(object)
,因此不会调用您的相等方法(Cell.Equals(Cell)
),而是调用Cell.Equals(object)
。因此,要解决此问题,您可以更改单元格
类以覆盖默认的相等方法:
public class Cell
{
public int row, col;
public bool visited;
public char value;
public override bool Equals(object other) //never gets here
{
if(!(other is Cell)) return false;
return other != null && other.row == row && other.col == col;
}
}
问题是您的代码不知道
T
有一个特殊的方法
bool Equals<T>(T other)
首先,您应该重写
对象.Equals
,以遵从此Equals
:
public override bool Equals(object obj) => Equals(obj as Cell);
如果要覆盖object.Equals
,则还需要覆盖object.GetHashCode()
:
此外,为了获得更好的性能,您可以使用
单元格实现IEquatable
,并在状态下使用EqualityComparer.Default
。这会更好,因为EqualityComparer.Default
在实现时使用IEquatable.Equals(T)
,在不可用时返回到object.Equals(object)
。我想也许可以帮助您将这段代码放在哪里?但这样我就忽略了泛型模板,所有类型中都没有覆盖,它可以在泛型模板的编译类型中填充T,它会自动选择使用EqualityComparer.Default
?使用EqualityComparer.Default.Equals(genericState,(obj作为状态).genericState)
而不是调用genericState.Equals((obj作为状态).genericState)
。
public class State<T> where T : IEquatable<T> {
... // The rest of the code remains the same
}
...
public class Cell : IEquatable<Cell> {
... // The rest of the code remains the same
}
public override bool Equals(object obj) => Equals(obj as Cell);
public override int GetHashCode() => row * 31 + col;