2012-06-12 69 views
-3

任何想法爲什麼函數返回false?等於不開火!!!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(); 
    } 
} 
+1

請正確縮進您的代碼。 –

+0

'throw'沒有評論? – V4Vendetta

+0

您使用'DateTime.Today'的方式對於生產軟件來說不夠好。這是在午夜左右要求難以捉摸的問題。每整個操作只調用一次該屬性。 –

回答

4

我不會打擾嘗試你的Equals代碼試圖做的,我只是說爲什麼它沒有被稱爲弄清楚,爲什麼你總是讓假的。

默認情況下,==操作返回那裏它們指向同一個對象according to the docs引用類型真實。

所以你可以做的是overload the operator在你的Nested類,或致電p.Nested.Equals(s.Nested)。如果你走過載路線,你也需要重載!=

如果你去Equals路線,你可以有你Nested類實現Equatable<T> interface所以你得到一個強類型Equals方法,而不是一個以object

+0

但我並未指向相同的對象!每個嵌套都有新的嵌套()實例。 – Mike

+0

@Mike完全是......所以你知道你不是指向同一個對象,而且文檔說明'=='將如何表現。這就是爲什麼它會不斷爲你回報。 –

0

如果你想要這個工作,你需要確保你也覆蓋上嵌套==操作符 - 你只有重載的Equals但你調用嵌套==嵌套

0

好像你想要兩個嵌套類型如果它們的「有效性」屬性相等,則它們相等 如果是這樣,請從Equals()中移除「return base.Equals(obj)」並將其上面的行如下更改:

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

此外,等於()將不會被調用,除非你也改變你的函數功能<>像這樣:

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