तो, IEnumerable के लिए एक बहुत ही आम विस्तार विधि, भागो:क्यों C# के अधिभार रिज़ॉल्यूशन Func <T,T> और एक्शन <T> के बीच काम नहीं करता है?
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
जब मैं उपयोग करने के लिए उस के साथ, उदाहरण के लिए प्रयास करते हैं, DbSet.Add:
invoice.Items.Run(db.InvoiceItems.Add);
// NB: Add method signature is
// public T Add(T item) { ... }
... संकलक शिकायत है कि इसमें गलत रिटर्न प्रकार है, क्योंकि यह शून्य विधि की अपेक्षा कर रहा है। तो, कि कार्रवाई के बजाय एक समारोह लेता भागो के लिए एक अधिभार जोड़ें:
public static IEnumerable<T> Run<T>(this IEnumerable<T> source, Func<T, T> action)
{
return source.Select(action).ToList().AsEnumerable();
}
और अब संकलक शिकायत है कि "कॉल निम्न विधियों के बीच अस्पष्ट है ..."
तो मेरे सवाल है, रन विधि का एक्शन ओवरलोड अस्पष्टता का कारण बन सकता है जब यह विधि समूह के लिए मान्य नहीं है? सही तरीके से
'db.InvoiceItems.Add' का हस्ताक्षर क्या है? – leppie
सार्वजनिक टी जोड़ें (टी आइटम) {...} –
संक्षिप्त उत्तर: 'x => x.ToString() 'क्या यह लैम्ब्डा बस ToString का आह्वान कर सकता है या ToString का आह्वान कर सकता है और इसका परिणाम वापस कर सकता है?दूसरे शब्दों में, क्या यह लैम्ब्डा को फनक या एक्शन के रूप में संभाला जाना चाहिए? संकलक आपके लिए यह निर्णय नहीं ले सकता है इसलिए एक त्रुटि। – Polity