मैं एक साधारण Money
decimal
से एक अंतर्निहित कलाकारों के साथ प्रकार है:अप्रत्याशित प्रभाव
static class MoneyExtensions
{
public static Money Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, Money> selector)
{
return source.Select(x => (decimal)selector(x)).Sum();
}
}
:
struct Money
{
decimal innerValue;
public static implicit operator Money(decimal value)
{
return new Money { innerValue = value };
}
public static explicit operator decimal(Money value)
{
return value.innerValue;
}
public static Money Parse(string s)
{
return decimal.Parse(s);
}
}
और मैं उन मूल्यों पर संचालित करने के लिए एक Sum()
अधिभार परिभाषित
जो मैंने अपेक्षा नहीं की थी वह मौजूदा Sum()
एक्सटेंशन विधियों में हस्तक्षेप करने के लिए इस विस्तार विधि के लिए थी:
var source = new[] { "2" };
Money thisWorks = source.Sum(x => Money.Parse(x));
int thisWorksToo = source.Sum(new Func<string, int>(x => int.Parse(x)));
int thisDoesNot = source.Sum(x => int.Parse(x));
त्रुटि यह है कि "आसानी से प्रकार 'मनी' को 'int' में परिवर्तित नहीं किया जा सकता है। एक स्पष्ट रूपांतरण मौजूद है (यदि आप एक डाली याद कर रहे हैं?) "। यह सही है कि संकलक एक अधिभार सटीक मेल है कि हल करने से अधिक int => decimal => Money
अंतर्निहित रूपांतरण के पक्ष में है?
मुझे सटीक मिलान – Jodrell
सटीक मिलान याद आ रहा है सिस्टम में 'Sum() '' int') 'int' अधिभार। – dahlbyk
क्या आप एक पूरा उदाहरण प्रदान कर सकते हैं जो संकलन-त्रुटि उत्पन्न करता है? आपने अपनी 'उपयोग' घोषणाएं नहीं दिखाईं हैं, जो इस स्थिति में बहुत महत्वपूर्ण हैं। –