Función que devuelve falso al evaluar [cerrado]

¿Alguna idea de por qué la función está devolviendo falso? ¡Equals no dispara tan bien!

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

preguntado el 12 de junio de 12 a las 09:06

Por favor, aplique una sangría a su código. -

LA throw no se comenta? -

La forma en que estás usando DateTime.Today no es lo suficientemente bueno para el software de producción. Esto está pidiendo problemas difíciles de alcanzar alrededor de la medianoche. Llame a esta propiedad solo una vez por toda la operación. -

Eliminaste la función de la pregunta... Es difícil responder algo sobre el código que no muestra... -

3 Respuestas

No me voy a molestar en tratar de averiguar cuál es tu Equals el código está tratando de hacer, solo digo por qué no se llama y por qué siempre obtiene falso.

De forma predeterminada, == El operador devuelve verdadero para los tipos de referencia donde apuntan al mismo objeto, de acuerdo con los documentos.

Así que lo que podrías hacer es sobrecargar al operador en tu Nested clase, o llamar p.Nested.Equals(s.Nested). Si va por la ruta de la sobrecarga, tendrá que sobrecargar != también.

Si vas al Equals ruta, puedes tener tu Nested clase implementar el Equatable<T> interfaz. por lo que obtienes un tipo fuerte Equals método en lugar de una toma object.

Respondido el 12 de junio de 12 a las 09:06

¡¡¡Pero no estoy señalando el mismo objeto!!! Cada Nested tiene nuevas instancias de Nested(). - Mike

@Mike Exactamente ... para que sepa que no está apuntando al mismo objeto y la documentación dice cómo == tendremos. Es por eso que constantemente te devuelve false. - adam houldsworth

Si desea que esto funcione, debe asegurarse de anular también el operador == en Nested: solo ha anulado Equals pero está llamando a Nested == Nested

Respondido el 12 de junio de 12 a las 09:06

Parece que desea que dos tipos anidados sean iguales si sus propiedades de Validez son iguales. Si es así, elimine de Equals() "return base.Equals(obj)" y cambie la línea de arriba de la siguiente manera:

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

Además, no se llamará a Equals() a menos que también cambie su Func<> así:

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

Respondido el 12 de junio de 12 a las 09:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.