我有一个类,它实现了这个简单的接口:
public interface IPosition
{
int? Position { get; set; }
}
我有一个班级通过这个
Position
属性来收集班级:
public static class ReorderPositions
{
public static IList<IPosition> Reorder(IList<IPosition> list)
{
// different actions, resorting
return positionList;
}
}
所以,为了测试它,我创建了假类(其他属性对我来说不需要真正的类来重新排序):
public class ReorderPositionsFakeModel : IPosition
{
public int? Position { get; set; }
}
然后我创建了一个工厂类来填充
List<ReorderPositionsFakeModel>
:
public static class ReorderPositionFakeModelFactory
{
public static IList<ReorderPositionsFakeModel> Create(List<int> positions)
{
positions = positions.OrderBy(x => x).ToList();
List<ReorderPositionsFakeModel> model = new();
foreach (var position in positions)
{
model.Add(new ReorderPositionsFakeModel { Position = position });
}
return model;
}
}
但是当我尝试使用时:
var model = ReorderPositionFakeModelFactory.Create(new List<int> { -2, -1, 0, 4, 5, 6, 7, 9, 10, 11, 12, 18, 19, 20, 21, 23, 24, 25, 26 });
var result = ReorderPositions.Reorder(model);
我得到:
错误 CS1503 参数 1:无法从 'System.Collections.Generic.IList' 到 'System.Collections.Generic.IList'
为什么会这样?怎么了?
ReorderPositionsFakeModel
实现IPosition
,为什么不能转换?...
您面临的问题是由于您试图将 ReorderPositionsFakeModel 对象列表传递给 ReorderPositions。需要 IPosition 对象列表的 Reorder 方法。 试试这个:
var model = ReorderPositionFakeModelFactory.Create(new List<int> { -2, -1, 0, 4, 5, 6, 7, 9, 10, 11, 12, 18, 19, 20, 21, 23, 24, 25, 26 });
var result = ReorderPositions.Reorder(model.Cast<IPosition>().ToList());
IList<ReorderPositionsFakeModel>
不是 IList<IPosition>
(例如,您可以将 IPosition
添加到后者,但不能添加到前者)。有几种方法可以处理这个问题。一种是使用 covariant IEnumerable<out T>
接口而不是 IList
:
public static class ReorderPositions
{
public static IEnumerable<IPosition> Reorder(IEnumerable<IPosition> list)
{
// different actions, resorting
return default;
}
}
public static class ReorderPositionFakeModelFactory
{
public static IEnumerable<ReorderPositionsFakeModel> Create(List<int> positions)
{
// ...
}
}
或创建具有所需类型的新列表:
ReorderPositions.Reorder(model.ToList<IPosition>());