Tengo un tipo simple Money
con una conversión implícita de decimal
:efecto inesperado de conversión implícita de tipo de delegado inferencia
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);
}
}
Y definido una sobrecarga Sum()
para operar en esos valores:
static class MoneyExtensions
{
public static Money Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, Money> selector)
{
return source.Select(x => (decimal)selector(x)).Sum();
}
}
Lo que no esperaba era que este método de extensión interfiriera con los métodos de extensión Sum()
existentes:
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));
El error es "No se puede convertir implícitamente el tipo 'Money' en 'int'. existe una conversión explícita (¿falta un yeso?)". ¿Es cierto que el compilador favorece int => decimal => Money
conversiones implícitas sobre la resolución de una sobrecarga que es una coincidencia exacta?
me falta la coincidencia exacta – Jodrell
El '' sobrecarga int' de Suma() 'en System.Linq. – dahlbyk
¿Puede proporcionar un ejemplo completo que genere ese error de compilación? No has mostrado tus declaraciones de 'uso', que son muy importantes en esta situación. –