यह विफल हो जाता है
string temp = () => {return "test";};
त्रुटि के साथ
लैंबडा अभिव्यक्ति को 'स्ट्रिंग' टाइप करने के लिए परिवर्तित नहीं किया जा सकता है क्योंकि यह एक प्रतिनिधि प्रकार नहीं है
त्रुटि का क्या मतलब है और मैं इसे कैसे हल कर सकता हूं?
यह विफल हो जाता है
string temp = () => {return "test";};
त्रुटि के साथ
लैंबडा अभिव्यक्ति को 'स्ट्रिंग' टाइप करने के लिए परिवर्तित नहीं किया जा सकता है क्योंकि यह एक प्रतिनिधि प्रकार नहीं है
त्रुटि का क्या मतलब है और मैं इसे कैसे हल कर सकता हूं?
जवाबों:
यहाँ समस्या यह है कि आपने एक अनाम विधि परिभाषित की है जो वापस लौटती है stringलेकिन इसे सीधे a में निर्दिष्ट करने का प्रयास कर रहे हैं 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" वेरिएबल का अब मान "परीक्षण" होगा।
एक छोटे सहायक समारोह और जेनरिक का उपयोग करके आप कंपाइलर को टाइप का अनुमान लगा सकते हैं, और इसे थोड़ा छोटा कर सकते हैं:
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);
एक अनाम विधि एक मानदंड प्रतिनिधि का उपयोग कर एक मान लौटा सकती है। यहां एक उदाहरण है जहां मैंने दिखाया है कि एक अनाम विधि का उपयोग करके एक मूल्य कैसे वापस किया जाए।
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();
}
}
}