KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have a simple Money type with an implicit cast from decimal : 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); } } And I defined a Sum() overload to operate on those values: static class MoneyExtensions { public static Money Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, Money> selector) { return source.Select(x => (decimal)selector(x)).Sum(); } } What I didn't expect was for this extension method to interfere with the existing Sum() extension methods: 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)); The error is "Cannot implicitly convert type 'Money' to 'int'. An explicit conversion exists (are you missing a cast?)". Is it correct that the compiler favors int => decimal => Money implicit conversions over resolving an overload that's an exact match?
Tags (comma-separated)
Save Edits
Cancel