如何将通用List中相同接口的各种派生类作为参数传递给函数?

Mix*_*xer 3 c# generics interface list derived-class

如何将具有不同继承类的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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

两种选择:

1)如果您使用的是C#4和.NET 4+,并且只需迭代这些点Calculate,只需将签名更改为:

    void Calculate(IEnumerable<ControlPoint> points)
Run Code Online (Sandbox Code Playgroud)

这将使用通用协方差.

2)你可以使方法通用:

    void Calculate<T>(List<T> points) where T : ControlPoint
Run Code Online (Sandbox Code Playgroud)

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