短い:
私は方法がdecimal GetAmount(IThing thing)
です。 things.Sum(GetAmount)
を使用すると、CS0121エラーが発生します。Sum(Func<T, int>)
とSum(Func<T, int?>)
の間のコールはあいまいです。どうして?Linq.Sum()がintとintの間に曖昧な理由は何ですか?
長い:
public interface IThing { }
public class Sample {
public decimal GetAmount(IThing thing) { return 0; }
public decimal Total(IThing[] things) { return things.Sum(GetAmount); }
}
Error CS0121 The call is ambiguous between the following methods or properties:
'Enumerable.Sum<TSource>(IEnumerable<TSource>, Func<TSource, int>)'
and'Enumerable.Sum<TSource>(IEnumerable<TSource>, Func<TSource, int?>)'
コンパイラはdecimal
とdecimal?
間またはコンパイラは、多くの合計のオーバーロードのいずれかを選ぶことができなかった場合は混乱していた場合、私は多少理解するであろう。しかし、なぜ/どのようにそれはところでのみint
とint?
に自分自身を制限しなかった、VS/R#が「親切」エラーとして.Sum()
にGetAmount
を渡す浮き彫りにし、代わりに方法を返すint型を渡すことを示唆しています。コンパイラは、この部分を2番目のエラーとしてフラグを立てません。 GetAmount
からint GetAmount(IThing thing)
に変更すると、実際にはコンパイラのエラーが解決されます。
ps。私はコンパイラエラーの解決策を探していません。 GetAmountをFunc<IThing, decimal> GetAmount { get; }
にするか、things.Sum(thing => GetAmount(thing))
のように合計を実装することができます。 @IvanStoevの提案によれば、things.Sum(new Func<IThing, decimal>(GetAmount))
も(私にとっては)うまく動作します。
私は、コンパイラが戻り値の型のためにメソッドをditinguishできないためだと思います。しかし、私はコンパイラが*なぜ*区別する必要があるのだろうと思っています。良い質問。 – HimBromBeere
intがどこから来たのか分かりませんが、私は[小数点以下でエラーが出ます] – Reniuz
@mybirthnameこれは、どのようなものかを推測する明確な方法がある限り、機能します* OPの場合*です。 – HimBromBeere