Función que devuelve falso al evaluar [cerrado]
Frecuentes
Visto 107 equipos
-3
¿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();
}
}
3 Respuestas
4
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
0
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
0
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 c# c#-4.0 or haz tu propia pregunta.
Por favor, aplique una sangría a su código. - Bali C
LA
throw
no se comenta? - V4VendettaLa 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. - Jirka HanikaEliminaste la función de la pregunta... Es difícil responder algo sobre el código que no muestra... - Guffa