The idea is that with Clone you can create a new object of the same type as the one you are calling it with, without knowing the exact type of object you are calling it to.
For instance:
void Test(ICloneable original) { var cloned = original.Clone(); }
Here, cloned has the same runtime type as original , and you did not need to know that this type should perform cloning.
However, the usefulness of ICloneable almost does not exist, since it does not determine the semantics of the clone operation: is it a shallow copy or a deep copy ? Since the interface does not respond to one or the other, you cannot really know what you are getting. And since knowing that this is important because you need to handle the clone accordingly, ICloneable itself is a very burnt card.
Defining your own interface using the Clone method (with well-defined semantics) makes sense.
Update: See also: Why should I implement ICloneable in C #?
source share