संक्षिप्त:
मेरे पास एक विधि decimal GetAmount(IThing thing)
है। things.Sum(GetAmount)
का उपयोग CS0121 त्रुटि में परिणाम: कॉल Sum(Func<T, int>)
और Sum(Func<T, int?>)
के बीच संदिग्ध है। क्यूं कर?LINQ.Sum() int और int के बीच संदिग्ध decimals के साथ क्यों है?
अब:
public interface IThing { }
public class Sample {
public decimal GetAmount(IThing thing) { return 0; }
public decimal Total(IThing[] things) { return things.Sum(GetAmount); }
}
Error CS0121 The call is ambiguous between the following methods or properties:
'Enumerable.Sum<TSource>(IEnumerable<TSource>, Func<TSource, int>)'
and'Enumerable.Sum<TSource>(IEnumerable<TSource>, Func<TSource, int?>)'
मैं कुछ हद तक समझ में होगा अगर संकलक decimal
और decimal?
के बीच या यदि संकलक कई योग भार के के किसी भी लेने नहीं कर सकता है उलझन में था। लेकिन क्यों/कैसे यह अपने आप के लिए एक ही int
और int?
Btw, वी.एस./आर # 'काम आते हुए' को सीमित था एक त्रुटि के रूप में .Sum()
को GetAmount
गुजर प्रकाश डाला गया और बजाय विधि लौटने एक पूर्णांक गुजर सुझाव देता है। संकलक इस भाग को दूसरी त्रुटि के रूप में ध्वजांकित नहीं करता है। बदलना GetAmount
से int GetAmount(IThing thing)
वास्तव में संकलक त्रुटि 'हल' करता है।
ps। मैं संकलक त्रुटि के लिए एक समाधान की तलाश नहीं कर रहा हूँ। मुझे पता है कि मैं GetAmount को Func<IThing, decimal> GetAmount { get; }
में बदल सकता हूं या कुल things.Sum(thing => GetAmount(thing))
लागू कर सकता हूं। और जैसा कि @IvanStoev द्वारा सुझाया गया है, things.Sum(new Func<IThing, decimal>(GetAmount))
काम करता है (मेरे लिए) भी।
मुझे लगता है कि ऐसा इसलिए है क्योंकि संकलक केवल उनके रिटर्न-प्रकार के कारण विधियों को अलग नहीं कर सकता है। हालांकि मुझे आश्चर्य है कि कंपाइलर को * अंतर करने के लिए * जरूरत क्यों है, क्योंकि केवल एक ही विधि है। हालांकि अच्छा सवाल है। – HimBromBeere
मुझे नहीं पता कि int कहाँ से आया था, लेकिन मैं [decimals के साथ त्रुटि प्राप्त कर रहा हूं] (https://dotnetfiddle.net/ZoCY2G) – Reniuz
@mybirthname यह तब तक काम करता है जब यह अनुमान लगाने के लिए एक अनौपचारिक विधि है * ओपीएस मामले में * है। – HimBromBeere