2010-12-14 1 views
0

Как я понимаю, 2 лямбда должны быть равны, если они объявляют один и тот же код в том же порядке с теми же параметрами.Являются ли объекты лямбда-значения?

Но простой тест на 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()); 
    } 

$

Можете ли вы сказать мне, если Im делает что-то неправильно, или, может быть, лямбды не стоимость объектов

+1

Как LambdaTest связан с NullSpecification? –

+0

Я думал, что выражение лямбда было делегатом. Независимо от того, является ли это равенством или тем же объектом, над которым вы должны тестировать. – Swanny

+0

Пример кода - это всего лишь выдержка моего реального кода (я думаю, что я удаляю некоторые части, которые делают его не очень понятным). Но основное внимание уделяется тому, что свойство Predicate в обоих случаях одинаково одинаково, поэтому Predicate.GetHashCode() должен возвращать то же самое, если они равны. – jorge

ответ

0

Я думаю, это потому, что лямбды являются делегатами и Delgate является ссылочным типом. У вас могут быть два делегата одного типа, но с отдельным списком вызовов, и они не совпадают. В случае лямбда, даже если они выполняют ту же работу, если вы вызываете ее, вы не вызываете другую.