2012-05-09 40 views

Trả lời

95

Vấn đề ở đây là bạn đã xác định phương thức ẩn danh trả về số string nhưng đang cố gắng gán trực tiếp cho số string. Đó là một biểu thức mà khi được gọi tạo ra string nó không trực tiếp là string. Nó cần phải được gán cho một loại đại biểu tương thích. Trong trường hợp này sự lựa chọn đơn giản nhất là Func<string>

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

Điều này có thể được thực hiện trong một dòng bằng một chút đúc hoặc sử dụng các nhà xây dựng đại biểu để thành lập các loại hình lambda tiếp theo là một sự thỉnh nguyện.

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

Lưu ý: Cả hai mẫu có thể thiếu để các hình thức biểu hiện mà thiếu { return ... }

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

Cảm ơn. Vì vậy, không có cách nào để làm mọi thứ trên một dòng (bao gồm cả việc gán chuỗi)? Giá trị tôi muốn ("thử nghiệm", mà thực sự là một biến trong cuộc sống thực) là bên trong một lambda vì vậy tôi phạm vi lỏng lẻo nếu tôi cố gắng để xác định như bạn có ở trên. – 4thSpace

+0

@ 4thSpace nó có thể được thực hiện trong một dòng với một số đúc ác. Tôi đã cập nhật câu trả lời của mình để hiển thị cách – JaredPar

+0

Hoặc trong trường hợp này, chỉ cần 'Func temp =() =>" test ";'. – Gabe

12

Bạn đang cố gán một chức năng đại biểu để một kiểu string. Hãy thử điều này:

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

Bây giờ bạn có thể thực hiện chức năng thusly:

string s = temp(); 

Các "s" bây giờ biến sẽ có giá trị "thử nghiệm".

+1

Điều này không biên dịch: "Không thể gán biểu thức lambda cho biến cục bộ được nhập ngầm" –

+0

@Dave: Thú vị, không biết về giới hạn đó. Cập nhật, cảm ơn! –

6

Sử dụng một hàm helper ít và Generics bạn có thể cho trình biên dịch suy ra các loại, và rút ngắn nó một chút:

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

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

Side lưu ý: đây cũng là tốt đẹp như bạn sau đó có thể trở lại một ẩn danh loại:

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

Kỹ thuật thú vị. Điều này có làm tăng thời gian chạy trên toàn bộ thời gian hoặc tất cả ở thời gian biên dịch không? – ToolmakerSteve

3

bạn có thể sử dụng phương pháp vô danh với lập luận:

int arg = 5; 

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

Bạn có thể, nhưng vui lòng giải thích đây là câu trả lời cho câu hỏi. – ToolmakerSteve

1

Một phương pháp ananomous có thể trả về một giá trị bằng cách sử dụng truy vấn func. Đây là ví dụ mà tôi đã chỉ ra cách trả về một giá trị sử dụng phương pháp 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(); 
     } 
    } 
} 
Các vấn đề liên quan