-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コードが何をしようとしているのかをわざわざ理解しようとするつもりはありません。なぜそれが呼び出されないのか、そしてなぜあなたが常に false になるのかを言っているだけです。

docs によると、デフォルトでは、==オペレーターは同じオブジェクトを指す参照型に対して true を返します。

したがって、クラスで演算子をオーバーロードするか、 を呼び出すことができます。過負荷ルートに行く場合は、過負荷も必要になります。Nestedp.Nested.Equals(s.Nested)!=

Equalsルートに行くと、NestedクラスにEquatable<T>インターフェースEqualsを実装させることができるので、object.

于 2012-06-12T08:22:40.283 に答える
0

これを機能させたい場合は、Nested で == 演算子もオーバーライドする必要があります。Equals のみをオーバーライドしていますが、Nested == Nested を呼び出しています。

于 2012-06-12T08:27:14.823 に答える
0

Validity プロパティが等しい場合、2 つのネストされた型を等しくしたいようです。その場合は、Equals() から「return base.Equals(obj)」を削除し、その上の行を次のように変更します。

return (this.Validity.Equals((ネストされた obj).Validity));

また、次のように Func<> も変更しない限り、 Equals() は呼び出されません。

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

于 2012-06-12T08:31:52.543 に答える