改善C#程序的157建议——建议42学习笔记:使用泛型参数兼容泛型接口的不可变性。

例:


   interface ISalary<T>

   {

       void Pay();

   }

   class BaseSalaryCounter<T> : ISalary<T>

   {

       public void Pay()

       {

           Console.WriteLine("Pay base salary");

       }

   }

   class Emplyee

   {

       public string Name { get; set; }

   }

   class Programmer : Emplyee

   { }

   class Manager : Emplyee

   { }

   class Program

   {

       static void Main(string[] args)

       {

           ISalary<Programmer> s = new BaseSalaryCounter<Programmer>();

           PrintSalary(s);

       }

       static void PrintSalary(ISalary<Emplyee> s)

       { s.Pay(); }

   }


在PrintSalary这个方法中,方法接受的参数类型是ISalary<Employee>。于是,我们想当然地认为ISalary<Programmer>必然可是可以被PrintSalary方法接收的。实现这段代码变异会发生类似如下的错误:

错误    CS1503    参数 1: 无法从“ConsoleApp1.ISalary<ConsoleApp1.Programmer>”转换为“ConsoleApp1.ISalary<ConsoleApp1.Emplyee>”    ConsoleApp1    C:\Users\WH\Desktop\ConsoleApp1\ConsoleApp1\Program.cs    33    活动的


编译器对于接口和委托类型参数的检查是非常严格的,除非用关键字out特别声明,不然这段代码只会编译失败。要让PrintSalary完成需求,我们可以使用泛型类型参数:


static void PrintSalary<T>(ISalary<T> s)

       { s.Pay(); }


上一篇:直播系统开发:功能创新提升用户留存


下一篇:阿里云服务器申请购买时应重点考虑的优惠活动