Điều này không thành công
string temp = () => {return "test";};
với lỗi
Không thể chuyển đổi biểu thức lambda thành kiểu 'chuỗi' vì nó không phải là kiểu đại biểu
Lỗi có nghĩa là gì và tôi có thể giải quyết nó như thế nào?
Điều này không thành công
string temp = () => {return "test";};
với lỗi
Không thể chuyển đổi biểu thức lambda thành kiểu 'chuỗi' vì nó không phải là kiểu đại biểu
Lỗi có nghĩa là gì và tôi có thể giải quyết nó như thế nào?
Câu trả lời:
Vấn đề ở đây là bạn đã xác định một phương thức ẩn danh trả về a string
nhưng đang cố gắng gán nó trực tiếp cho a string
. Đó là một biểu thức mà khi được gọi sẽ tạo ra string
nó không trực tiếp a string
. Nó cần được chỉ định cho một loại đại biểu tương thích. Trong trường hợp này, sự lựa chọn dễ dàng 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 cách ép kiểu một bit hoặc sử dụng hàm tạo ủy nhiệm để thiết lập kiểu lambda theo sau là một lời gọi.
string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Lưu ý: Cả hai mẫu có thể được rút gọn thành biểu mẫu thiếu { return ... }
Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();
Func<string> temp = () => "test";
.
string temp = new Func<string>(() => "test")();
Bạn đang cố gắng gán một đại biểu hàm cho một kiểu chuỗi. Thử đi:
Func<string> temp = () => {return "test";};
Bây giờ bạn có thể thực thi hàm do đó:
string s = temp();
Biến "s" bây giờ sẽ có giá trị "test".
Sử dụng một hàm trợ giúp nhỏ và các số liệu chung, bạn có thể cho phép trình biên dịch suy ra 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");
Lưu ý phụ: điều này cũng rất hay vì sau đó bạn có thể trả về một kiểu ẩn danh:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
bạn có thể sử dụng phương pháp ẩn danh với đối số:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Một phương thức ẩn danh có thể trả về một giá trị bằng cách sử dụng một đại biểu func. Đây là một ví dụ mà tôi đã chỉ ra cách trả về giá trị bằng phương thức ẩn danh.
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();
}
}
}
Đây là một ví dụ khác sử dụng C # 8 ( cũng có thể hoạt động với các phiên bản .NET khác hỗ trợ các tác vụ song song )
using System;
using System.Threading.Tasks;
namespace Exercise_1_Creating_and_Sharing_Tasks
{
internal static class Program
{
private static int TextLength(object o)
{
Console.WriteLine($"Task with id {Task.CurrentId} processing object {o}");
return o.ToString().Length;
}
private static void Main()
{
const string text1 = "Welcome";
const string text2 = "Hello";
var task1 = new Task<int>(() => TextLength(text1));
task1.Start();
var task2 = Task.Factory.StartNew(TextLength, text2);
Console.WriteLine($"Length of '{text1}' is {task1.Result}");
Console.WriteLine($"Length of '{text2}' is {task2.Result}");
Console.WriteLine("Main program done");
Console.ReadKey();
}
}
}