2010-07-05 14 views
15

derlemek ve bu gibi LambdaExpression hesaplamak için çalışılmıştır:LambdaExpression'un iç içe geçtiği bir hata var mı?

artı (10, artı (1,2))

Ancak sonuç 13.

kodu, 4 değildir:

Bu ise
using System; 
using System.Linq.Expressions; 

namespace CheckLambdaExpressionBug 
{ 
    class Program 
    { 
     static void Main(string[] _args) 
     { 
      ParameterExpression p1 = Expression.Parameter(typeof (int), "p1"); 
      ParameterExpression p2 = Expression.Parameter(typeof (int), "p2"); 
      LambdaExpression lambda = Expression.Lambda(Expression.Call(typeof(Program).GetMethod("Plus"), p1, p2), p1, p2); 

      InvocationExpression exp1 = Expression.Invoke(
       lambda, 
       Expression.Constant(1), 
       Expression.Constant(2) 
       ); 

      InvocationExpression exp2 = Expression.Invoke(
       lambda, 
       Expression.Constant(10), 
       exp1 
       ); 

      var func = (Func<int>) Expression.Lambda(exp2).Compile(); 

      int v = func(); 
      Console.Out.WriteLine("Result = {0}", v); 
     } 

     public static int Plus(int a, int b) 
     { 
      return a + b; 
     } 
    } 
} 
+3

VS2010 ile denedim: 13 – Henrik

+3

hedeflediğiniz olursa = Sonuç .NET 3.5 (VS2010'da bile) sonra "Sonuç = 4" elde edersiniz; .NET 4'ü hedeflerseniz, "Sonuç = 13" elde edersiniz. – LukeH

+0

Çok teşekkür ederim. Evet, .NET 3.5 kullanıyorum. – kitafan

cevap

0

çok 3.5'de 13 üretmek gibi görünüyor:

 var plus = new Func<int, int, int>((a, b) => a + b); 
    var func = new Func<int>(() => plus(10, plus(1, 2))); 
    var res = func(); 
    Console.WriteLine(res); 
+2

Yeniden üretme adımları için çok iddialı bir varsayım yapıyorsunuz. Durma ve deneyin: int res = 10 + (1 + 2); Bunu da bir sorunu yeniden oluşturmaya Somut bir örnek verdi soruda 13 ... dönmek hayret. Diğer durumları analiz etmenin bir anlamı yoktur. – kitafan

+0

bu konuda haklı olabilirsiniz: =) – santa

0

belki bu

Var artı = new Func denemek yerel var sonucu ataması gerekiyor ((a, b) => a + b); var puls_1 = plus (1, 2); var fonk = Yeni Func (() => artı (10, plus_1)); var res = func(); Console.WriteLine (res);

1

kimse bu gönderme gibi görünüyor beri:

O .NET 3.5 bir hata olarak görünüyor ve .NET düzeltilmiştir 4.