2011-02-25 82 views
9

這行代碼,試圖分配一個lambda表達式到LambaExpression類型的變量,lambda表達式語法VS LambdaExpression類

LambdaExpression expr = n => n; 

它失敗編譯錯誤消息:

不能轉換拉姆達 表達爲 'System.Linq.Expressions.LambdaExpression' 因爲它不是代表 類型

所以它需要是一個委託類型。從概念上講,我覺得很奇怪,因爲我可以使用像這樣的工廠方法構建一個LambdaExpression實例。

廠拉姆達from MSDN

LambdaExpression lambdaExpr = Expression.Lambda(
    Expression.Add(
     paramExpr, 
     Expression.Constant(1) 
    ), 
    new List<ParameterExpression>() { paramExpr } 
); 

這不是一個委託類型。

它使我們想知道爲什麼lambda到LambaExpression不能工作?

回答

8

那麼,這確實工作:

Expression<Func<int, int>> exp = n => n; 
LambdaExpression lambda = exp; 

注意Expression<TDelegate>LambdaExpression派生。

我認爲你不能僅僅使用LambdaExpression作爲類型的原因是那麼n(在你的例子中)的類型不能被推斷。

考慮的是,你還不能做到這一點,基本上是同樣的原因:

// What is this? An Action? A ThreadStart? What? 
Delegate d =() => Console.WriteLine("Hi!"); 

而你可以做到這一點:

Action a =() => Console.WriteLine("Hi!"); 
Delegate d = a; 

它本質上是一回事。

2

因爲LambdaExpression是一種在運行時生成lambda表達式的方法,其中n => n在編譯時被轉換爲生成的類。

簡而言之:他們是做兩樣不同的事情做同樣的事情,但不能一起使用。

2

引用MSDN LambdaExpression類型以表達式樹的形式表示lambda表達式。從LambdaExpression派生並且更明確地捕獲了Lambda表達式類型的Expression類型也可以用來表示Lambda表達式。在運行時,表示lambda表達式的表達式樹節點始終爲Expression類型。

LambdaExpression的NodeType屬性的值是Lambda。

使用Lambda工廠方法創建LambdaExpression對象。