В C# возможно передавать производный объект через конструктор базового объекта, потому что производный объект является подтипом базового объекта. Это означает, что он содержит все поля и методы базового класса, а также может иметь свои собственные дополнительные поля и методы. При создании производного объекта можно использовать конструктор базового объекта для инициализации его базовых полей и выполнения других необходимых операций.
Наследование в конструкторах классов C# работает следующим образом: при вызове конструктора производного класса с помощью ключевого слова `base` в его определении, сначала выполняется конструктор базового класса. Затем выполняются операции, определенные в конструкторе производного класса. Таким образом, конструктор базового класса вызывается перед конструктором производного класса.
Конструкторы с параметрами, которые являются объектами класса, не вызывают ошибку, потому что в C# объекты передаются по ссылке, а не по значению. Это означает, что при передаче объекта в параметр конструктора, передается ссылка на этот объект, а не его копия. Поэтому изменения, сделанные в конструкторе, могут повлиять на исходный объект.
Операция "base(ob)" в данном контексте наследования классов означает вызов конструктора базового класса с параметром "ob". Это позволяет производному классу использовать конструктор базового класса для инициализации его полей и выполнения других требуемых операций перед выполнением собственных операций производного класса.