Func在评估时返回false

时间:2012-06-12 08:19:47

标签: c# c#-4.0

知道为什么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();
    }
}

3 个答案:

答案 0 :(得分:4)

我不打算试图找出你的Equals代码试图做什么,我只是说为什么它没有被调用以及为什么你总是变得虚假。

默认情况下,==运算符为引用类型返回true,它们指向相同的对象according to the docs

所以你可以在Nested课程中overload the operator,或致电p.Nested.Equals(s.Nested)。如果你去过载路线,你还需要重载!=

如果您使用Equals路线,可以让Nested班级实施Equatable<T> interface,这样您就可以获得强类型Equals方法,而不是采用object方法1}}。

答案 1 :(得分:0)

如果你希望这个工作,你需要确保你也覆盖嵌套上的==运算符 - 你只重写了Equals但是你正在调用Nested == Nested

答案 2 :(得分:0)

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

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

此外,除非您也更改了Func&lt;&gt;,否则不会调用Equals()。像这样:

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