
如图,出现图中错误的原因是什么?该如何解决。没有从double到icloneable的装箱转换。
关注引自免费微信小程序:皆我百晓生
根据您提供的信息,看起来你在尝试使用一个名为DeepCopy2DList<T>的方法,但是编译器报了一个错误,提示类型double不能作为泛型类型或方法的参数。这个错误是因为C#的泛型要求类型参数必须是引用类型(Reference Type),或者是实现了System.ICloneable接口的值类型(Value Type)。double是一个内置的值类型,并未实现ICloneable接口,所以它不能直接作为泛型类型参数。
要解决这个问题,你可以创建一个新的类来包装double,使其成为可以被复制的对象。下面是如何操作的一个例子:
首先,创建一个新的类来包装double:
public class Doubled : ICloneable
{
public double Value { get; set; }
public object Clone()
{
return new Doubled { Value = this.Value };
}
}
然后,在需要使用的地方,将原来的double数组替换为Doubled对象的数组。例如,将List<List<double>>替换为List<List<Doubled>>。
为了适应这些更改,你需要修改相关代码,比如DeepCopy2DList方法的定义以及所有使用到double的地方。以下是修改后的DeepCopy2DList方法:
public static List<List<Doubled>> DeepCopy2DList(List<List<Doubled>> original)
{
if (original == null)
return null;
var copied = new List<List<Doubled>>(original.Count);
for (int i = 0; i < original.Count; i++)
{
copied.Add(original[i].Select(x => (Doubled)x.Clone()).ToList());
}
return copied;
}
接下来,你需要在代码中的相应位置,将double替换为Doubled。例如:
var b = Enumerable.Repeat(new Doubled { Value = Math.Ceiling(3 / 2.0) }, subrows.Count).ToArray();
以及
List<List<Doubled>> dataBox = DeepCopy2DList(original as List<List<Doubled>> ?? new List<List<Doubled>>());
这样,你就可以正确地使用泛型方法了,而不会收到关于double不能作为泛型类型的错误。记住,每次你想处理一个double时,都要通过Doubled类进行操作。