Почему Predicate‹› запечатан?

Я хотел получить класс от Predicate‹IMyInterface>, но оказалось, что Predicate‹> запечатан. В моем случае я хотел просто вернуть инвертированный (!) результат назначенной функции. У меня есть другие способы достичь цели. Мой вопрос заключается в том, о чем могли подумать разработчики 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

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


person GregUzelac    schedule 18.10.2008    source источник
comment
Когда вы сказали перевернутый, я не был уверен, что вы имели в виду. Для меня обратная функция от A до B — это функция от B до A. Я думаю, что отрицание могло бы быть яснее. Что вы действительно ищете?   -  person Jay Bazuzi    schedule 18.10.2008
comment
Извините, но после того, как вы обновились, я просто не понимаю, в чем вопрос: вы спрашиваете, как иметь список делегатов, а для тех, которых нет, - вы добавляете инвертированный делегат?   -  person Omer van Kloeten    schedule 19.10.2008


Ответы (3)


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

Честно говоря, не похоже, что наследование здесь действительно уместно — просто напишите метод, возвращающий инверсию оригинала. Это так просто:

public static Predicate<T> Invert<T>(Predicate<T> original)
{
    return t => !original(t);
}
person Jon Skeet    schedule 18.10.2008

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

Predicate<T> p;
Predicate<T> inverted = t => !p(t);
person Omer van Kloeten    schedule 18.10.2008

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

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

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

person pero    schedule 20.10.2008