Было бы полезно иметь возможность определять специальную семантику для операций присваивания, но только если бы такая семантика могла применяться ко всем ситуациям, когда одно место хранения данного типа копировалось в другое. Хотя стандарт C ++ реализует такие правила присваивания, он может позволить себе определять все типы во время компиляции. Когда все Reflection и дженерики добавляются в список, все становится намного сложнее.
В настоящее время правила в .net указывают, что для места хранения может быть установлено значение по умолчанию для его типа - независимо от того, что это за тип - путем обнуления всех байтов. Кроме того, они указывают, что любое хранилище может быть скопировано в другое хранилище того же типа путем копирования всех байтов. Эти правила применяются ко всем типам, включая дженерики. Имея две переменные типа KeyValuePair<t1,t2>
, система может копировать одну в другую, не зная ничего, кроме требований к размеру и выравниванию этого типа. Если бы t1
, t2
или типу было возможно любое поле в пределах одного из этих типов , реализовать конструктор копирования, код, который копировал бы один экземпляр структуры в другой, был бы очень более сложный.
Это не означает, что такая возможность дает некоторые существенные преимущества - возможно, что, если бы разрабатывался новый каркас, преимущества операторов присвоения пользовательских значений и конструкторов по умолчанию превысили бы затраты. Однако затраты на внедрение будут существенными в новой структуре и, вероятно, будут непреодолимыми для существующей.