为什么`List <T>`不能克隆?

use*_*312 4 c# list

为什么.net泛型不List<T>提供任何Clone()功能?

为什么不实施IClonable

Zor*_*vat 5

克隆对象(尤其是ICloneable接口)的问题在于公共接口不能很好地传达意图.

即 - 克隆的这种Clone功能是否也List<T>包含元素,或者只是克隆列表并复制对包含元素的引用?浅拷贝,复制引用并仅创建新列表将等效于:

List<T> clone = new List<T>(originalList);
Run Code Online (Sandbox Code Playgroud)

但是,如果你想强制克隆所有包含的元素,那么它将等同于:

List<T> clone = originalList.Select(x => (T)x.Clone()).ToList();
Run Code Online (Sandbox Code Playgroud)

这假设该类型T正在实施ICloneable.但是,即使使用此解决方案,也无法提前告知代码执行的确切影响.x克隆自身元素意味着什么?它是一个浅层副本(由MemberwiseClone它继承形式的方法提供System.Object),还是一个深层副本.如果很深,如果列表中的两个对象引用相同的第三个对象会发生什么?第三个对象是复制两次还是只复制一次?等等......你可以看到它的发展方向.

由于上面列出的所有原因,克隆设施未包含在框架中.它由自定义代码决定克隆对象然后为其实现自定义代码的含义.