मुझे समझ नहीं आता क्यों सी # समाप्त होता है निम्नलिखित LINQPad कोड में एक गलत विस्तार विधि को क्रियान्वित करते हैं:"x => {throw ..} का Lambda ओवरलोडेड विधि में Func <T,Task> से मिलान करने के लिए अनुमानित है?
void Main()
{
// Actual: Sync Action
"Expected: Sync Action".Run(x => { x.Dump(); });
// Actual: Async Task
"Expected: Async Task".Run(async x => { await System.Threading.Tasks.Task.Run(() => x.Dump()); });
// Actual: Async Task!!
"Expected: Sync Action".Run(x => { throw new Exception("Meh"); });
}
static class Extensions
{
public static void Run<T>(this T instance, Action<T> action)
{
"Actual: Sync Action".Dump();
action(instance);
}
public static void Run<T>(this T instance, Func<T, System.Threading.Tasks.Task> func)
{
"Actual: Async Task".Dump();
func(instance).Wait();
}
}
संकलक क्यों लगता है कि लैम्ब्डा यहाँ एक टास्क देता है?
मुझे तीसरे कॉल में रन() को "वास्तविक: सिंक एक्शन" देखने की उम्मीद है क्योंकि लैम्ब्डा में कुछ भी इंगित करता है कि यह एक फंक रिटर्निंग टास्क है।
यह लौटने शून्य है LINQPad कोड .. डंप() विस्तार विधि के अलावा विशेष कुछ नहीं है। – ichen
आप सही हैं, यह वास्तव में एक्सटेंशन विधि से असंबंधित है क्योंकि मैं सामान्य अधिभारित विधियों के साथ पुन: पेश करने में सक्षम था। – ichen