C#_协变与逆变
What(1.出现主要是用来修饰泛型的、只有泛型接口和泛型委托可以使用、遵循里氏替换原则)

out【修饰委托只能作为返回值】
和谐或自然的变化(里氏替换-父类装载子类)
其变化给我们的感受是合理的

in【修饰委托只能作为参数】
逆常规、不正常的变化(里氏替换-子类变成父类)
其变化给我们的感受是不合理的

Why

为开发者提供便利
提供设计思路

How

【在使用相同类型签名的泛型委托时,泛型委托实例化的对象可以赋值的前提】
泛型有着继承关系,不同的泛型委托对象存储的方法处理的返回值类型不一致时,如果加了out修饰,就可以让父类型委托存储子类型委托(有了out就会自动去判断泛型类型是否有继承关系)【对返回类型进行了限制】
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。,如果加了in修饰,就可以让子类型的委托存储父类型委托(有了in就会自动去判断泛型类型是否有继承关系)【对参数类型进行了限制】
最终存储的泛型委托类型取决于修饰泛型的修饰符类型,两个对象自己可以赋值
最终存储的泛型接口类型取决于修饰泛型的修饰符类型,两个对象自己可以赋值