函数在评估时返回假

本文关键字:返回 评估 函数 | 更新日期: 2023-09-27 18:36:48

知道为什么 func 返回 false 吗?等于也不会触发!!

class Program
{
    static void Main(string[] args)
    {          
        Func<Person, SomethingElse, bool> matchNested = 
            (p, s) => p.Nested == s.Nested;
        var matched = matchNested(new Person()
            {
                Age = 10, 
                Nested = new Nested()
                    {
                        Validity = DateTime.Today
                    }
            },
            new SomethingElse()
            {
                Age = 10, 
                Nested = new Nested()
                    {
                        Validity = DateTime.Today
                    }
            });
        Console.WriteLine(matched);
    }
}
internal class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Nested Nested { get; set; }
}
internal class SomethingElse
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Nested Nested { get; set; }
}
internal class Nested
{
    public DateTime Validity { get; set; }
    public override bool Equals(object obj)
    {     
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }
        if (!this.Validity.Equals((obj as Nested).Validity))
            return false;
        return base.Equals(obj);
    }
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

函数在评估时返回假

我不会费心去弄清楚你的Equals代码试图做什么,我只是说为什么它没有被调用以及为什么你总是得到错误。

默认情况下,根据文档,对于指向同一对象的引用类型,==运算符返回 true。

因此,您可以做的是重载Nested类中的运算符,或调用 p.Nested.Equals(s.Nested) 。如果采用重载路线,则还需要重载!=

如果你走Equals路线,你可以让你的Nested类实现Equatable<T>接口,这样你就会得到一个强类型的Equals方法,而不是一个采用object的方法。

如果你想让它工作,你需要确保你也覆盖了嵌套上的 == 运算符 - 你只覆盖了等于,但你正在调用嵌套 == 嵌套

如果嵌套类型的有效性属性相等,则似乎您希望两个嵌套类型相等。如果是这样,请从 Equals() 中删除"返回基数。等于(obj)",并更改其上方的行,如下所示:

返回(这个。Validity.Equals((obj as Nested).有效性));

此外,除非您也更改 Func,否则不会调用 Equals(<>如下所示:

Func matchNested = (p, s) => p.Nested.Equals(s.Nested);