Языки, управляемые памятью, обычно работают со ссылками, а не с объектами. Когда вы определяете класс и его члены, вы определяете поведение объекта, но когда вы создаете переменную, вы работаете со ссылками на эти объекты.
Теперь оператор = применяется к ссылкам, а не к объектам. Когда вы присваиваете ссылку на другую, вы фактически делаете принимающую опорную точку тем же объектом, что и другая ссылка.
Type var1 = new Type();
Type var2 = new Type();
var2 = var1;
В приведенном выше коде два объекта создаются в куче, один из которых указан как var1, а другой - как var2. Теперь последний оператор делает ссылку на var2 тем же объектом, на который ссылается var1. После этой строки сборщик мусора может освободить второй объект, и в памяти остается только один объект. Во всем процессе никакие операции не применяются к самим объектам.
Возвращаясь к тому, почему = невозможно перегрузить, реализация системы - единственная разумная вещь, которую вы можете сделать со ссылками. Вы можете перегрузить операции, которые применяются к объектам, но не к ссылкам.