Stas
Ага предположим что я мог бы в делегат с аргументом User, засунуть метод с UserChild. Окей, теперь я вызываю делегат, он принимает User, а значит и всех его потомков, ну ок, отдам туда User, а метод то принимает UserChild и что ему тогда делать с этим User, ведь у UserChild есть ещё и свои поля которые могут быть вызваны внутри этого метода. Ещё есть вопросы о том что здесь пох на ООП?
не важно кто от кого наследуется на уровне классов, важно что делегат - это тип данных, все на типах и тип совпадает или нет - это единственное что важно на уровне CLS. Если грубо то на уровне сигнатуры сравнивает, несоответствие - ошибка, она не пытается делать даже static cast