Неожиданный эффект неявного преобразования при выводе типа делегата

У меня есть простой тип 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));

Ошибка: «Невозможно неявно преобразовать тип Money в int. Существует явное преобразование (отсутствует ли приведение?)». Верно ли, что компилятор отдает предпочтение неявным преобразованиям int => decimal => Money вместо разрешения перегрузки, которая является точным совпадением?

9
задан dahlbyk 30 June 2011 в 12:15
поделиться