2010-01-11 232 views
4

好吧,我迷路了。爲什麼第一個函數WRONG(在lambda表達式中是波浪狀的),但是第二個函數是RIGHT(意味着它編譯)?無法將表達式類型'lambda表達式'轉換爲返回類型'System.Linq.Expressions.Expression <System.Func <IProduct,string,bool >>'

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val) 
    { 
     return (h => h.product_name == val); 

    } 

    public static Expression<Func<IProduct, bool>> IsValidExpression2() 
    { 
     return (m => m.product_name == "ACE"); 

    } 

回答

6

你的第一個函數將需要兩個參數。 Func<x,y,z>定義了兩個參數和返回值。既然你有一個IProduct和一個string作爲參數,你需要lambda中的兩個參數。

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val) 
    { 
     return ((h, i) => h.product_name == val); 
    } 

你的第二個功能是隻Func<x,y>,這樣就意味着函數簽名,但有一個參數,因此你的拉姆達聲明編譯。

+0

那麼該函數沒有使用第二個參數,所以我會說這不是_needed_但是該方法的簽名是錯誤的 – 2010-01-11 22:42:18

+0

同意。說明它的簡潔方式。 – womp 2010-01-11 22:46:35

+1

這不會編譯,btw ...需要'(h,i)=>' – 2010-01-11 22:51:52

3

什麼是中間string打算做什麼?你可以把它通過編譯:

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val) 
{ 
    return (h,something) => h.product_name == val; 
} 

或者,也許你的意思是:

public static Expression<Func<IProduct, string, bool>> IsValidExpression() 
{ 
    return (h,val) => h.product_name == val; 
} 

+0

我的猜測是,OP沒有意識到val是懸掛的,因此不是lambda表達式的結果方法的簽名的一部分 – 2010-01-11 22:40:57

0

Func<IProduct, string, bool>是一個代表與下面的簽名的方法:

bool methodName(IProduct product, string arg2) 
{ 
    //method body 
    return true || false; 
} 

所以

public static Expression<Func<IProduct, string, bool>> IsValidExpression(string val) 
{ 
    return (h => h.product_name == val); 
} 

具有返回類型和返回值之間的分延。您正試圖返回Expression<Func<IProduct, bool>>類型的對象。

val參數不是您所委派的方法的參數,但會被提升(作爲實現結果函數的類的一部分),並且由於它不是所產生的方法的參數,所以它不應該是在Func型delclaration

+0

因爲這是一個'表達式'(不是委託),它不像你所描述的那樣 - 那裏**是**沒有「結果函數」;它是一個表達式樹... – 2010-01-11 22:42:26

+0

@marc你是正確的表達式<>是一個表達式樹,而不是一個方法,我爲「表達式樹可以編譯成的方法」,我嘗試制定爲「結果函數」,但是Func <>是委託類型的陳述是正確的:) – 2010-01-11 22:46:11

0

試圖修復lambda表達式可以肯定的是,下列參比物添加到現有CS文件之前:

使用System.Linq的;
using System.Linq.Expressions;

缺少這些引用可能會導致相同的錯誤(「無法將lambda表達式轉換爲鍵入'System.Linq.Expressions.Lambda表達式',因爲它不是委託類型」)。

相關問題