Подтвердить что ты не робот

Значение по умолчанию для общего предиката в качестве аргумента

Первый вопрос для меня:)

Мне нужно каким-то образом определить предикат по умолчанию, используя общий формат в формате

Func<T, bool>

а затем использовать это как аргумент по умолчанию. Что-то вроде этого:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true)

Когда я это сделаю, я получаю ошибку компиляции:

Значение параметра по умолчанию для предиката должно быть константой времени компиляции

Есть ли гладкий способ сделать это, который я пропускаю, или должен сделать функцию предиката нулевой и соответствующим образом изменить мою функциональную логику?

Спасибо,

4b9b3361

Ответ 1

Значения по умолчанию для параметров метода должны быть константами времени компиляции, так как значения по умолчанию на самом деле копируются ко всем сайтам вызова метода компилятором.

Для этого вам нужно использовать перегрузку:

public bool Broadcast(byte command, MemoryStream data, bool async) {
    return Broadcast(command, data, async, t => true);
}

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate) {
    // ...
}

Кроме того, в mscorlib есть определенный делегат Predicate<T>, который вы можете использовать вместо него. Это та же самая подпись, что и Func<T, bool>, но она явно отмечает ее как делегата, которая решает, выполняется ли действие в экземплярах T

Ответ 2

Сделать перегрузку для широковещательной передачи, которая не принимает последний аргумент.

Ответ 3

Попробуйте следующее:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = default(Func<T, bool>))

Но я думаю, что вам нужно проверить предикат!= null.