C#参数作为接口,如何使用?

问题描述 投票:0回答:2

我有一个类,它实现了这个简单的接口:

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
,为什么不能转换?...

c# interface implementation implements
2个回答
2
投票

您面临的问题是由于您试图将 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());

1
投票

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>());
© www.soinside.com 2019 - 2024. All rights reserved.