2012-05-09 33 views
62

這種失敗如何使用匿名方法返回值?

string temp =() => {return "test";}; 

與錯誤

Cannot convert lambda expression to type 'string' because it is not a delegate type

什麼是錯誤的意思是,我該如何解決呢?

回答

95

這裏的問題是,你已經定義了一個匿名方法,它返回一個string但試圖直接將它分配給一個string。這是一個表達式,當調用產生一個string它不是直接string。它需要分配給兼容的委託類型。在這種情況下最簡單的選擇是Func<string>

Func<string> temp =() => {return "test";}; 

這可以在一行中由位鑄造或使用委託構造建立拉姆達隨後通過調用的種類來完成。

string temp = ((Func<string>)(() => { return "test"; }))(); 
string temp = new Func<string>(() => { return "test"; })(); 

提示:這兩種樣品可以短到缺乏{ return ... }

Func<string> temp =() => "test"; 
string temp = ((Func<string>)(() => "test"))(); 
string temp = new Func<string>(() => "test")(); 
+0

謝謝。所以沒辦法在一行上做所有事情(包括分配字符串)?我想要的值(「test」,實際上是現實生活中的一個變量)在另一個lambda的內部,所以如果我嘗試按照上面的方式定義,則我會放寬範圍。 – 4thSpace

+0

@ 4thSpace它可以在一行中完成一些邪惡的鑄造。我更新了我的答案,以顯示 – JaredPar

+0

的方式或者在這種情況下,只是'Func temp =()=>「test」;'。 – Gabe

12

您正試圖一個功能委託分配給一個字符串類型的表達形式。試試這個:

Func<string> temp =() => {return "test";}; 

您現在可以正是如此執行函數:

string s = temp(); 

的 「S」 變量現在的值爲 「測試」。

+1

這不會編譯:「不能分配lambda表達式到一個隱式類型的本地變量」 –

+0

@Dave:有趣的,不知道這個限制。更新,謝謝! –

6

使用小助手功能,仿製藥可以讓編譯器推斷出類型,並縮短它一點點:

public static TOut FuncInvoke<TOut>(Func<TOut> func) 
{ 
    return func(); 
} 

var temp = FuncInvoke(()=>"test"); 

邊注:這也不錯,你再能返回一個匿名類型:

var temp = FuncInvoke(()=>new {foo=1,bar=2}); 
+0

有趣的技術。這是否會增加運行時間開銷,還是全部在編譯時? – ToolmakerSteve

3

,您可以使用匿名方法與參數:

int arg = 5; 

string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg); 
+0

你可以,但請解釋這是如何回答這個問題。 – ToolmakerSteve

1

ananomous方法可以使用func deligate返回一個值。 這裏是我已經展示瞭如何使用ananomous方法返回一個值的例子。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApp1 
{ 
    class Program 
    { 


     static void Main(string[] args) 
     { 
      Func<int, int> del = delegate (int x) 
       { 
        return x * x; 

       }; 

      int p= del(4); 
      Console.WriteLine(p); 
      Console.ReadLine(); 
     } 
    } 
}