2010-12-14 27 views
0

据我所知2 lambda应该是相等的,只要他们用相同的参数以相同的顺序声明相同的代码即可。是否为lambda值对象?

但在GetHashCode的一个简单的测试失败:

$

private class LambdaTest 
    { 
     private bool x; 

     public Expression<Func<object, bool>> Predicate 
     { 
      get { return o => x; } 
     } 

     public LambdaTest(bool x) 
     { 
      this.x= x; 
     } 

     public override int GetHashCode() 
     { 
      return Predicate.GetHashCode(); 
     } 

    } 

$

测试 $

[Test] 
    public void hashonlambdas() 
    { 
     NullSpecification n1 = new NullSpecification(true); 
     NullSpecification n2 = new NullSpecification(true); 

     Assert.AreEqual(n1.GetHashCode(), n2.GetHashCode()); 
    } 

$

你能告诉我,如果林做错事或也许lambda表达式不是值对象

+1

LambdaTest如何与NullSpecification相关? – 2010-12-14 23:02:06

+0

我以为lambda表达式是一个代表。无论如何,您应该测试的是平等还是相同的对象。 – Swanny 2010-12-14 23:08:26

+0

示例代码只是我真实代码的摘录(我想我删除了一些使其不太清晰的部分)。但重点在于Predicate属性在两个对象中基本相同,所以如果它们是Equals,则Predicate.GetHashCode()必须返回相同的值。 – jorge 2010-12-14 23:56:10

回答

0

我想这是因为lambda表达式是代表和Delgate是引用类型。 您可以拥有两个相同类型的代表,但具有不同的调用列表,并且它们不相同。在lambda的情况下,即使他们做了同样的工作,如果你打电话给你,你也不会打电话给另一个人。

相关问题