kısa:
decimal GetAmount(IThing thing)
yöntemim var. things.Sum(GetAmount)
kullanımı bir CS0121 hatasıyla sonuçlanır: çağrı Sum(Func<T, int>)
ve Sum(Func<T, int?>)
arasında belirsizdir. Niye ya?Neden int ve int arasında belirsiz ondalıklı Linq.Sum()?
uzun:
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?>)'
derleyici decimal
ve decimal?
arasında veya derleyici birçok Sum aşırı herhangi Açamadığım eğer karıştı eğer biraz anlayacaklardır. Ama neden/o yardımsever 'sadece int
ve
int?
Btw, VS/R # kendisini sınırlamak vermedi nasıl bir hata olarak .Sum()
için GetAmount
geçen vurgular ve bunun yerine yöntemi dönen bir int geçen öneriyor. Derleyici bu kısmı ikinci bir hata olarak işaretlemiyor. GetAmount
'un int GetAmount(IThing thing)
'a değiştirilmesi aslında derleyici hatasını 'çözer'.
ps. Derleyici hatasına bir çözüm aramıyorum. Biliyorum GetAmount'u Func<IThing, decimal> GetAmount { get; }
'a çevirebilirim veya Total gibi things.Sum(thing => GetAmount(thing))
'u uygulayabilirim. Ve @IvanStoev tarafından önerildiği gibi, things.Sum(new Func<IThing, decimal>(GetAmount))
da (benim için) çalışır.
Bunun nedeni, derleyicinin yalnızca dönüş türü nedeniyle yöntemleri bırakamamasıdır. Bununla birlikte, derleyicinin * tek bir yöntem olduğu gibi ayırt etmesinin bile * neden ihtiyaç duyduğunu merak ediyorum. İyi soru olsa da. – HimBromBeere
Int'nin nereden geldiğini bilmiyorum, ancak [ondalıklarla hata alıyorum] (https://dotnetfiddle.net/ZoCY2G) – Reniuz
@mybirthname Bu, hangi sonuca ulaşmak için benzersiz bir yöntem olduğu sürece çalışır * OP'ler durumunda. – HimBromBeere