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

举报
AI浩 发表于 2021/12/23 01:44:00 2021/12/23
【摘要】 例:     interface ISalary<T>     {         void Pay();     }     class BaseSalaryCounter<T> : ISa...

例:

    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(); }

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/106664960

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。