Это простой пример двух перегрузок методов расширения
public static class Extended
{
public static IEnumerable<int> Even(this List<int> numbers)
{
return numbers.Where(num=> num % 2 == 0);
}
public static IEnumerable<int> Even(this List<int> numbers, Predicate<int> predicate)
{
return numbers.Where(num=> num % 2 == 0 && predicate(num));
}
}
Я хотел бы объединить их в один, установив делегат как необязательный:
public static class Extended
{
public static IEnumerable<int> Even(this List<int> numbers, Predicate<in> predicate = alwaysTrue)
{
return numbers.Where(num=> num % 2 == 0 && predicate(num));
}
public static bool alwaysTrue(int a) { return true; }
}
Однако компилятор выдает ошибку:
Значение параметра по умолчанию для предиката должно быть константой времени компиляции
Я не вижу, как моя функция alwaysTrue не является постоянной, но эй, компилятор знает лучше:)
Есть ли способ сделать параметр делегата необязательным?