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