using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
public static async Task Main()
var container = new ServiceCollection();
container.AddLogging(b => b.AddConsole());
using (var scope = container.BuildServiceProvider().CreateScope())
var sp = scope.ServiceProvider;
var logger = sp.GetRequiredService<ILogger<Program>>();
var doubles = new List<double> { 1.23, 68.256, 44.55, 96.127, 393.4567, 2.45, 4.1 };
for (var i = 0; i < 100; i++)
var timer1 = Stopwatch.StartNew();
var avg1 = doubles.Average<double>();
var timer2 = Stopwatch.StartNew();
var avg2 = doubles.Average();
logger.LogInformation("Without type: {0} [ticks={1}]", avg1, timer1.Elapsed.Ticks);
logger.LogInformation("Fixed type: {0} [ticks={1}]", avg2, timer2.Elapsed.Ticks);
Console.WriteLine("Working...");
public static class Extensions
public static double Average<T>(this IEnumerable<T> source)
throw new ArgumentNullException(nameof(source));
sum += Convert.ToDouble(v);
return (double)sum / count;
public static double Average(this IEnumerable<double> source)
throw new ArgumentNullException(nameof(source));
foreach (double v in source)