3

如何将具有不同继承类的List传递给带有父接口List的函数?编译器生成错误。

    public interface ControlPoint
    {
    }

    public class Knot:  ControlPoint
    {
    }

    public class Node:  ControlPoint
    {
    }

    class Spline
    {
         List<Knot> knots=new List<Knot>();
         List<Node> nodes=new List<Node>();

         void Calculate(List<ControlPoint> points) {} //<------- Compiler Error

        void Test()
        {
           Calculate(knots);
           Calculate(nodes);
        }

    }
4

1 回答 1

8

两种选择:

1) 如果您使用 C# 4 和 .NET 4+,并且只需要遍历 中的点Calculate,只需将签名更改为:

    void Calculate(IEnumerable<ControlPoint> points)

这将使用通用协方差。

2)您可以使该方法通用:

    void Calculate<T>(List<T> points) where T : ControlPoint

一般来说,我更喜欢第一个 - 即使你没有使用 .NET 4 / C# 4,如果你可以更改Calculate为 useIEnumerable<T>而不是List<T>,那会更干净 - 所以你可以将两者混合并使用通用方法IEnumerable<T>

于 2013-02-18T09:50:59.183 回答