ngắn:
Tôi có phương thức decimal GetAmount(IThing thing)
. Sử dụng things.Sum(GetAmount)
kết quả trong lỗi CS0121: cuộc gọi không rõ ràng giữa Sum(Func<T, int>)
và Sum(Func<T, int?>)
. Tại sao?Tại sao Linq.Sum() với số thập phân không rõ ràng giữa int và int?
còn:
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?>)'
Tôi hơi sẽ hiểu nếu trình biên dịch đã nhầm lẫn giữa decimal
và decimal?
hoặc nếu trình biên dịch không thể chọn bất kỳ của nhiều quá tải Sum. Nhưng tại sao/làm thế nào nó tự giới hạn để chỉ int
và int?
Btw, VS/R # 'helpfully' làm nổi bật qua GetAmount
-.Sum()
như một lỗi và đề nghị thông qua một phương pháp int trở về để thay thế. Trình biên dịch không gắn cờ phần này là lỗi thứ hai. Thay đổi GetAmount
thành int GetAmount(IThing thing)
thực sự làm 'giải quyết' lỗi trình biên dịch.
ps. Tôi không tìm kiếm một giải pháp cho lỗi trình biên dịch. Tôi biết tôi có thể biến GetAmount thành Func<IThing, decimal> GetAmount { get; }
hoặc triển khai Tổng số như things.Sum(thing => GetAmount(thing))
. Và theo đề xuất của @IvanStoev, things.Sum(new Func<IThing, decimal>(GetAmount))
cũng hoạt động (đối với tôi).
Tôi cho rằng đó là do trình biên dịch không thể thực hiện các phương thức ditinguish chỉ vì kiểu trả về của chúng. Tuy nhiên tôi tự hỏi tại sao trình biên dịch thậm chí * cần * để phân biệt, vì chỉ có một phương pháp. Câu hỏi hay. – HimBromBeere
Tôi không biết int đến từ đâu, nhưng tôi [nhận lỗi với số thập phân] (https://dotnetfiddle.net/ZoCY2G) – Reniuz
@mybirthname Tác phẩm này miễn là có một phương pháp rõ ràng để suy ra nó * là * trong trường hợp OP. – HimBromBeere