Цель интерфейса - позволить людям оперировать объектами, которые поддерживают интерфейс, не беспокоясь о том, что это за объекты на самом деле. Не зная, что iCloneable.Clone на самом деле собирается делать с любым конкретным объектом, просто знать, что объект поддерживает iCloneable, довольно бесполезно.
Было бы полезно, чтобы типы коллекций имели защищенный метод BaseClone, и чтобы у них был производный тип, который сделал бы его общедоступным (выполнение таких действий позволило бы получать клонируемые и неклонируемые типы из коллекций ). Имея что-то вроде словаря, поддерживающего метод Clone, было бы лучше, чем включать конструктор копирования, поскольку аргументом конструктора копирования мог быть тип, производный от Dictionary, но существенно отличающийся внутри.
Чтобы интерфейс клонирования был полезен, он должен включать свойство, с помощью которого элементы могли бы сказать, что они думают о клонировании (например, -1 - тип является неизменным и не нуждается в клонировании; -2 - клонирование типа скорее всего сломает его; тип поддерживает «клонирование» и определит, что операция DeepClone проверит все объекты, чтобы убедиться, что они не против клонирования, и в этом случае клонирует все вложенные изменяемые объекты. К сожалению, ничего подобного не существует в рамках.