Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在泛型列表中使用Equals方法失败_C#_Templates_Generics_Equals - Fatal编程技术网

C#在泛型列表中使用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

我有一个项目,我有使用模板的类状态。 我有一个类单元格,我使用它作为状态,所以状态保存一个单元格作为genericState。 现在我有一个通用函数,它检查两个实例是否相等。 问题是,它从不将State Equals方法留给Cell Equals方法

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;