我有从decimal
简单Money
类型与隐式转换:意想不到的效果
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
隐式转换?
我错过了完全匹配 – Jodrell
System.Linq中'Sum()'的int'重载。 – dahlbyk
你能提供一个完整的例子来产生编译错误吗?你没有展示你的“使用”声明,这在这种情况下非常重要。 –