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)
两种选择:
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>.