gpt4 book ai didi

c# - 为什么 Linq.Sum() 的小数点在 int 和 int 之间不明确?

转载 作者:太空狗 更新时间:2023-10-29 23:05:39 28 4
gpt4 key购买 nike

短:
我有一个方法 decimal GetAmount(IThing thing) .使用 things.Sum(GetAmount)导致 CS0121 错误:调用在 Sum(Func<T, int>) 之间不明确和 Sum(Func<T, 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?或者如果编译器无法选择许多 Sum 重载中的任何一个。但它为什么/如何将自己限制为只有 intint?

顺便说一句,VS/R#“有帮助”突出了传球 GetAmount.Sum()作为一个错误,并建议改为传递一个 int 返回方法。编译器不会将此部分标记为第二个错误。改变 GetAmountint GetAmount(IThing thing)实际上确实“解决”了编译器错误。

附言。我不是在寻找编译器错误的解决方案。我知道我可以将 GetAmount 变成 Func<IThing, decimal> GetAmount { get; }或像 things.Sum(thing => GetAmount(thing)) 一样执行 Total .正如@IvanStoev 所建议的,things.Sum(new Func<IThing, decimal>(GetAmount))也适用于(对我而言)。

最佳答案

你只是没有重载 .Sum()您可以在哪里传递您的方法。

你是对的,你可以那样做:

things.Sum(thing => GetAmount(thing))

thing => GetAmount(thing) - 这部分基本上将创建匿名函数和.Sum()重载了。

实现它的其他方法之一(更明显的方法可以让您了解实际发生的事情)是自己创建函数:

public decimal Total(IThing[] things) 
{
return things.Sum(new Func<IThing, decimal>(GetAmount));
}

实际上我在你的代码中遇到了另一个编译器错误(我使用的是 VS 2015)。

Severity Code Description Project File Line Suppression State Error CS0407 'decimal Sample.GetAmount(IThing)' has the wrong return type

所以我认为你得到那个有线错误只是因为预编译器分析器并不完美。

我做了更多研究并尝试在没有预编译器的情况下从命令提示符编译您的代码,如下所示:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe /out:Program.exe Program.cs

现在编译器返回正确的错误:

Program.cs(13,56): error CS0121: The call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Sum<Lambda.IThing>(System.Collections.Generic.IEnumerable<Lambda.IThing>, System.Func<Lambda.IThing,decimal>)' and 'System.Linq.Enumerable.Sum<Lambda.IThing>(System.Collections.Generic.IEnumerable<Lambda.IThing>, System.Func<Lambda.IThing,decimal?>)'

正如您现在看到的,我们在 decimal 中得到了正确的错误类型。如此奇怪的编译器错误,我们在预编译器源代码中找到了某处。

关于c# - 为什么 Linq.Sum() 的小数点在 int 和 int 之间不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179792/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com