函数在评估时返回假
本文关键字:返回 评估 函数 | 更新日期: 2023-09-27 18:36:48
知道为什么 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();
}
}
我不会费心去弄清楚你的Equals
代码试图做什么,我只是说为什么它没有被调用以及为什么你总是得到错误。
默认情况下,根据文档,对于指向同一对象的引用类型,==
运算符返回 true。
因此,您可以做的是重载Nested
类中的运算符,或调用 p.Nested.Equals(s.Nested)
。如果采用重载路线,则还需要重载!=
。
如果你走Equals
路线,你可以让你的Nested
类实现Equatable<T>
接口,这样你就会得到一个强类型的Equals
方法,而不是一个采用object
的方法。
如果你想让它工作,你需要确保你也覆盖了嵌套上的 == 运算符 - 你只覆盖了等于,但你正在调用嵌套 == 嵌套
如果嵌套类型的有效性属性相等,则似乎您希望两个嵌套类型相等。如果是这样,请从 Equals() 中删除"返回基数。等于(obj)",并更改其上方的行,如下所示:
返回(这个。Validity.Equals((obj as Nested).有效性));
此外,除非您也更改 Func,否则不会调用 Equals(<>如下所示:
Func matchNested = (p, s) => p.Nested.Equals(s.Nested);