如果泛型类型用 in 关键字标注, 泛型接口就是抗变的。这样就只能把T用作方法的输入参数
语法如下:
public interface IDisplay<in T>
{
void Show (T item);
}
ShapeDisplay 类实现 IDisplay<Shape> , 并使用 Shape 对象作为输入参数
public class ShapeDisplay : IDisplay<Shape>
{
public void Show (Shape s) =>
Console.WriteLine($"{s.GetType().Name} Width: {s.Width}, Height: {s.Height}");
}
写个例子调用一下:
public static void Main()
{
IDisplay<Shape> shapeDisplay = new ShapeDisplay();
IDisplay<Rectangle> rectangleDisplay = shapeDisplay;
rectangleDisplay.Show( rectangles[0] );
}
上面例子中, 创建了一个 ShapeDisplay的新实例, 会返回 IDisplay<Shape>, 并把它赋予 shapeDispaly变量。 因为 IDisplay<T>是抗变的, 所以可以把结果赋予 IDisplay<Rectangle> ,其中 Rectangle 派生自 Shape。 这次接口的方法只能把泛型类型定义为输入, 而 Rectangle 满足 Shape 的所有需求。