c# 协变和逆变

2021-05-17 20:30

阅读:370

标签:main   禁止用户   泛型接口   out   隐式   str   code   业务   console   

C#可变性类型

??可变性只支持引用类型,禁止用户定义的转换。

  • 协变性

??如果某个返回的类型可以由其子类替换,那么这个类型就是支持协变的

  • 逆变性

?? 如果某个参数类型可以由其父类替换,那么这个类型就是支持逆变的

可变性参数

??只有接口和委托可以拥有可变的类型参数

  • in

    参数是逆变
  • out

    参数是协变

实例

public class A
{}
public class B:A

协变

子类变成父类

A b=new B();//协变可正常转换

逆变

父类变成子类

B b=new A();//这样会直接报错
B b=(B)(new A());//强制转换

泛型的协变和逆变

逆变

??实例化参数是子类,泛型接口当中是父类,如果想要正常创建对象,需要在泛型参数上加上in标记

定义泛型接口

public interface IUserService
{
        
}
   

定义业务层实现接口

 public class UserService: IUserService
{
}

实例化

     static void Main(string[] args)
    {
     IUserService s =new  UserService();
    }

如果不加in的话,会报错

无法将类型“ConsoleApp6.IServer.UserService”
隐式转换为“ConsoleApp6.IServer.IUserService”。
存在一个显式转换(是否缺少强制转换?)

协变

??实例化参数是子类,泛型接口当中是父类,如果想要正常创建对象,需要在泛型参数上加上in标记

定义泛型接口

public interface IUserService
{
        
}
   

定义业务层实现接口

 public class UserService: IUserService
{
}

实例化

     static void Main(string[] args)
    {
     IUserService s =new  UserService();
    }

如果不加in的话,会报错

无法将类型“ConsoleApp6.IServer.UserService”
隐式转换为“ConsoleApp6.IServer.IUserService”。
存在一个显式转换(是否缺少强制转换?)

c# 协变和逆变

标签:main   禁止用户   泛型接口   out   隐式   str   code   业务   console   

原文地址:https://www.cnblogs.com/zhengyazhao/p/11760719.html

上一篇:c# socket 心跳 重连

下一篇:C# TextBox全选


评论


亲,登录后才可以留言!