C# 泛型接口的抗变

如果泛型类型用 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 的所有需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值