Почему Предикат <> запечатан? - PullRequest
5 голосов
/ 18 октября 2008

Я хотел получить класс из предиката , но похоже, что предикат <> запечатан. В моем случае я хотел просто вернуть инвертированный (!) Результат назначенной функции. У меня есть другие способы достижения цели. Мой вопрос заключается в том, о чем могли подумать дизайнеры MS, решив запечатать Predicate <>?

Не задумываясь, я придумал: (а) упростил их тестирование, просто время компромисса затрат (б) «ничего хорошего» не может быть получено из предиката <>

Что ты думаешь?

Обновление: существует n предикатов, которые динамически добавляются в список предикатов на этапе инициализации. Каждый является взаимоисключающим (если добавлен Abc, NotAbc добавляться не будет). Я заметил шаблон, который выглядит так:

bool Happy(IMyInterface I) {...}
bool NotHappy(IMyInterface I) { return !Happy(I); }
bool Hungry(IMyInterface I) {...}
bool NotHungry(IMyInterface I) { return !Hungry(I); }
bool Busy(IMyInterface I) {...}
bool NotBusy(IMyInterface I) { return !Busy(I); }
bool Smart(IMyInterface I) {...}
bool NotSmart(IMyInterface I) {...} //Not simply !Smart

Дело не в том, что я не могу решить проблему, а в том, что я удивляюсь, почему я не могу решить ее определенным образом.

Ответы [ 3 ]

19 голосов
/ 18 октября 2008

Predicate<T> - тип делегата. Вы никогда не можете получить от делегатов.

Если честно, это не звучит так, как будто наследование здесь действительно уместно - просто напишите метод, который возвращает инверсию оригинала. Это так просто:

public static Predicate<T> Invert<T>(Predicate<T> original)
{
    return t => !original(t);
}
4 голосов
/ 18 октября 2008

Предикат является делегатом. Вы не можете наследовать от типа делегата. Если вы хотите получить инвертированное значение, используйте следующее:

Predicate<T> p;
Predicate<T> inverted = t => !p(t);
2 голосов
/ 20 октября 2008

Функциональность делегата заключается в обработке списка указателей на безопасный тип метода. Разработчики C # решили, что нечего добавить к этой функциональности, и нет причин менять поведение делегатов.

Итак, Джон прав, наследование здесь не уместно.

Делегаты могут указывать на список методов. Мы добавляем в этот список оператор + = или Delegate.Combine . Если сигнатура метода не является пустой, то возвращается результат последнего вызванного метода (при правильном вызове).

...