-3

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

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();
    }
}
4

3 回答 3

4

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

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

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

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

于 2012-06-12T08:22:40.283 回答
0

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

于 2012-06-12T08:27:14.823 回答
0

如果它们的 Validity 属性相等,您似乎希望两个嵌套类型相等。如果是这样,请从 Equals() 中删除“return base.Equals(obj)”并将其上方的行更改如下:

return (this.Validity.Equals((obj as Nested).Validity));

此外,除非您也像这样更改 Func<> ,否则不会调用 Equals() :

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

于 2012-06-12T08:31:52.543 回答