Bor*_*ink 6 .net c# linq .net-7.0
我有以下代码,但它无法在 Visual Studio 17.4 预览版 2.1 和 .NET 7 RC1 SDK 中编译:
using System.Numerics;
int averageInt = Average<int, int>(1, 5, 10);
Console.WriteLine(averageInt);
double averageDouble = Average<int, double>(1, 5, 10);
Console.WriteLine(averageDouble);
TResult Average<TInput, TResult>(params TInput[] numbers)
    where TInput : INumber<TInput>
    where TResult : INumber<TResult> => numbers.Sum() / TResult.CreateChecked(numbers.Length);
Run Code Online (Sandbox Code Playgroud)
我得到的编译器错误是:
Error  CS1929  'TInput[]' does not contain a definition for 'Sum' and the best extension method overload 'Queryable.Sum(IQueryable<decimal>)' requires a receiver of type 'IQueryable<decimal>'
我尝试了以下方法作为替代方案,但它也无法编译:
using System.Numerics;
int averageInt = Average<int, int>(1, 5, 10);
Console.WriteLine(averageInt);
double averageDouble = Average<int, double>(1, 5, 10);
Console.WriteLine(averageDouble);
TResult Average<TInput, TResult>(params TInput[] numbers)
    where TInput : INumber<TInput>
    where TResult : INumber<TResult> => numbers.AsQueryable().Sum() / TResult.CreateChecked(numbers.Length);
Run Code Online (Sandbox Code Playgroud)
出现错误:
Error  CS1929  'IQueryable<TInput>' does not contain a definition for 'Sum' and the best extension method overload 'Queryable.Sum(IQueryable<decimal>)' requires a receiver of type 'IQueryable<decimal>'
我在这里缺少什么?
ATM 没有超载Enumerable.Sum(如Max等Min)利用通用数学。现在你可以使用以下方法解决Enumerable.Aggregate:
TResult Average<TInput, TResult>(params TInput[] numbers)
    where TInput : INumber<TInput>
    where TResult : INumber<TResult> 
    => numbers.Aggregate(TResult.Zero, (agg, t) => agg + TResult.CreateChecked(t)) 
          / TResult.CreateChecked(numbers.Length);
Run Code Online (Sandbox Code Playgroud)
相同的方法可以用于其他类似的操作。
如需内置支持 - 监控此 github问题。