Значение по умолчанию для универсального предиката в качестве аргумента - PullRequest
21 голосов
/ 26 января 2011

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

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

Func<T, bool>

, а затем используйте это как аргумент по умолчанию. Как то так:

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

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

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

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

Спасибо

Ответы [ 3 ]

26 голосов
/ 26 января 2011

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

Вы должны использовать перегрузку, чтобы сделать это:

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

3 голосов
/ 26 января 2011

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

2 голосов
/ 18 февраля 2011

Попробуйте это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...