gpt4 book ai didi

c# - lambda 表达式与方法组语句的评估方式有何不同?

转载 作者:行者123 更新时间:2023-12-04 15:15:28 25 4
gpt4 key购买 nike

我正在尝试更多地了解 lambdas 如何在 C# 中工作,但我对以下示例感到有些困惑。
我有一个加权平均函数:

public static double? WeightedAverage<T>(this IEnumerable<T> records, Func<T, double?> value, Func<T, double?> weight)
{
// snip actual calculation code
if (denominator != 0)
return numerator / denominator;
return null;
}
在一个地方,我使用了一个返回类型为 double 的辅助函数。 :
static double GetQuantity(Record record)
{
return record.Quantity * record.Factor;
}
并将其作为 weight 传递参数进入加权平均函数,如下所示:
return _records.WeightedAverage(r => r.Price, r => ReportHelpers.GetQuantity(r));
以上似乎工作正常。
令我困惑的部分:在一些地方,ReSharper 建议我将一些 lambda 转换为方法组。四处尝试看看这是如何工作的,我将调用更改为:
return _records.WeightedAverage(r => r.Price, ReportHelpers.GetQuantity);
这会导致错误, Expected a method with 'double?' GetQuantity(Record) signature有人能告诉我这里的幕后到底发生了什么吗?为什么 lambda 表达式在返回 GetQuantity 后没有产生类似的错误功能是 double而不是 double? ?方法组与 lambda 表达式的评估方式有何不同?
谢谢!

最佳答案

lambda 表达式没有错误,因为它的返回类型被推断为 double? ,匹配委托(delegate)参数,并且您从方法调用中显式返回 double 值。它的工作原理与此相同:static double? GetDoubleOrNull() => 0.0d;double 是可空 double 值的有效值。
然而,方法组转换有它需要满足的额外规则,并且因为它试图匹配一个委托(delegate),其中之一是 delegate compatibility.特别是,有一行是这样说的:

An identity or implicit reference conversion exists from the return type of M to the return type of D.

double 之间没有标识或隐式引用转换和 double? ,所以方法组转换失败。有一个隐式可为空的转换,但这在此处不适用。

关于c# - lambda 表达式与方法组语句的评估方式有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64393636/

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