Почему Predicate <> запечатан?

Я хотел унаследовать класс от 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

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

Когда вы сказали «перевернутый», я не понял, что вы имели в виду. Для меня обратная функция от A к B - это функция от B к A. Я думаю, что «отрицание» может быть более ясным. Что вы действительно ищете?

Jay Bazuzi 18.10.2008 20:39

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

Omer van Kloeten 19.10.2008 10:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
753
3

Ответы 3

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

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. Если сигнатура метода не является недействительной, то возвращается результат последнего вызванного метода (при правильном отзыве).

Другие вопросы по теме