สิ่งนี้ล้มเหลว
string temp = () => {return "test";};
ด้วยข้อผิดพลาด
ไม่สามารถแปลงนิพจน์แลมบ์ดาเป็นพิมพ์ 'สตริง' เนื่องจากไม่ใช่ประเภทผู้รับมอบสิทธิ์
ข้อผิดพลาดหมายถึงอะไรและฉันจะแก้ไขได้อย่างไร
สิ่งนี้ล้มเหลว
string temp = () => {return "test";};
ด้วยข้อผิดพลาด
ไม่สามารถแปลงนิพจน์แลมบ์ดาเป็นพิมพ์ 'สตริง' เนื่องจากไม่ใช่ประเภทผู้รับมอบสิทธิ์
ข้อผิดพลาดหมายถึงอะไรและฉันจะแก้ไขได้อย่างไร
คำตอบ:
ปัญหาที่นี่คือคุณได้กำหนดวิธีการแบบไม่ระบุตัวตนซึ่งส่งคืน a 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")();
Func<string> temp = () => "test";
.
string temp = new Func<string>(() => "test")();
คุณกำลังพยายามกำหนดฟังก์ชันที่มอบสิทธิ์ให้กับประเภทสตริง ลองสิ่งนี้:
Func<string> temp = () => {return "test";};
ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันได้แล้ว:
string s = temp();
ตอนนี้ตัวแปร "s" จะมีค่าเป็น "test"
การใช้ฟังก์ชันตัวช่วยเล็กน้อยและข้อมูลทั่วไปคุณสามารถให้คอมไพเลอร์สรุปประเภทและย่อให้สั้นลงเล็กน้อย:
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
หมายเหตุด้านข้าง: สิ่งนี้ดีเช่นกันเมื่อคุณสามารถส่งคืนประเภทที่ไม่ระบุตัวตนได้:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
คุณสามารถใช้วิธีการไม่ระบุชื่อกับอาร์กิวเมนต์:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
วิธีการที่ไม่ระบุชื่อสามารถส่งคืนค่าโดยใช้ตัวแทน func นี่คือตัวอย่างที่ฉันได้แสดงวิธีการคืนค่าโดยใช้วิธีการไม่ระบุตัวตน
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 # 8 ( สามารถทำงานกับ. NET เวอร์ชันอื่นที่รองรับงานคู่ขนานได้เช่นกัน )
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();
}
}
}