У меня есть простой тип Money
с неявным приведением от 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);
}
}
И я определил перегрузку Sum()
для работы с этими значениями:
static class MoneyExtensions
{
public static Money Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, Money> selector)
{
return source.Select(x => (decimal)selector(x)).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
вместо разрешения перегрузки, которая точно соответствует?