Я хотел унаследовать класс от Predicate <IMyInterface>, но похоже, что Predicate <> запечатан. В моем случае я хотел просто вернуть инвертированный (!) Результат указанной функции. У меня есть другие способы отпишусь. У меня вопрос: о чем могли подумать разработчики MS, решив запечатать Predicate <>?
Не долго думая, я придумал: (а) упростили их тестирование, просто компромисс между временем и стоимостью (b) "бесполезный" может происходить от предиката <>
Что вы думаете?
Обновление: существует 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
Дело не в том, что я не могу решить проблему, а в том, что мне интересно, почему я не могу решить ее определенным образом.
Извините, но после того, как вы обновились, я просто не понимаю, в чем вопрос: вы спрашиваете, как иметь список делегатов, а для тех, которых не существует, вы добавляете отрицанный делегат?





Предикат - это делегат. Вы не можете наследовать от типа делегата. Если вы хотите получить инвертированное значение, используйте следующее:
Predicate<T> p;
Predicate<T> inverted = t => !p(t);
Predicate<T> - это тип делегата. Вы никогда не можете происходить от делегатов.
Честно говоря, это не похоже на то, что наследование здесь действительно уместно - просто напишите метод, который возвращает инверсию оригинала. Это так просто:
public static Predicate<T> Invert<T>(Predicate<T> original)
{
return t => !original(t);
}
Функциональность делегата заключается в обработке списка указателей на типобезопасные методы. Разработчики C# решили, что к этой функциональности нечего добавить и нет причин менять поведение делегатов.
Итак, Джон прав, наследование здесь неуместно.
Делегаты могут указать список методов. Мы добавляем в этот список с помощью оператора + = или с помощью Delegate.Combine. Если сигнатура метода не является недействительной, то возвращается результат последнего вызванного метода (при правильном отзыве).
Когда вы сказали «перевернутый», я не понял, что вы имели в виду. Для меня обратная функция от A к B - это функция от B к A. Я думаю, что «отрицание» может быть более ясным. Что вы действительно ищете?