建议44:理解委托中的协变

委托中的泛型变量天然是部分支持协变的。为什么是“部分支持协变”?看下面示例:

   class Program
{
public delegate T GetEmployeeHanlder<T>(string name); static void Main()
{
GetEmployeeHanlder<Employee> getAEmployee = GetAManager;
Employee e = getAEmployee("Mike");
} static Manager GetAManager(string name)
{
Console.WriteLine("我是经理: " + name);
return new Manager() { Name = name };
} static Employee GetAEmployee(string name)
{
Console.WriteLine("我是雇员: " + name);
return new Employee() { Name = name };
} } interface ISalary<T>
{
void Pay();
} class BaseSalaryCounter<T> : ISalary<T>
{
public void Pay()
{
Console.WriteLine("Pay base salary");
}
} class Employee
{
public string Name { get; set; }
}
class Programmer : Employee
{
}
class Manager : Employee
{
}

上中的GetAManager返回的是一个Manager,但是在使用中,其实是将其赋值给一个泛型参数为Employee的委托变量。因为存在下面一种情况,所以编译不过:

            GetEmployeeHanlder<Manager> getAManager = GetAManager;
GetEmployeeHanlder<Employee> getAEmployee = GetAManager;

要让上面的代码编译通过,同样需要为委托中的泛型参数指定out关键字:

public delegate T GetEmployeeHanlder<out T>(string name);

除非考虑到该委托声明肯定不会用于可变性,否则,为委托中的泛型参数指定out关键字将会拓展委托的应用,建议在实际编码过程中永远这样使用。实际上,FCL4.0中的一些委托声明已经用out关键字来让委托支持协变了,如我们常常会使用到的:

public delegate TResult Func<out TResult>();

public delegate TOutput Converter<in TInput, out TOutput>(TInput input);

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

最新文章

  1. IndexedDB(本地存储)
  2. VC++ Post 方法 上传数据到web服务器
  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q29-Q31)
  4. 用FLASH,安智和IOS打电话方法
  5. 在程序中使用geos.dll
  6. (转载)移动WEB前端开发资源整合
  7. 几种常见SQL分页方式效率比较(转)
  8. Microsoft Language and Locale Codes(微软语言和地区代码汇总)
  9. javascript中常用的一些功能及正则表达式的用法
  10. 打开网页自动弹出qq客户端
  11. LD1-B(最短路径-SPFA)
  12. python运维开发(二十五)---cmdb开发
  13. win10虚拟桌面使用方法-提高工作效率
  14. WIFI探针技术
  15. c# 异步进度条组件BackgroundWorker
  16. [转]PHP利用Gearman来处理并行多进程问题
  17. 《头文字D》热门同人插画欣赏
  18. EUI Scroller实现自定义图片轮播 组件ScrollView
  19. mySql连接报错
  20. Android设计模式之单例模式的七种写法

热门文章

  1. centos安装PHP-pdo支持pdo
  2. maven命令行创建web项目报错:java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
  3. yii console
  4. MySQL error : Deadlock found when trying to get lock; try restarting transaction
  5. mysql实战优化之四:mysql索引优化
  6. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)
  7. 安装ElasticSearch客户端Kibana
  8. mysql 启动卡主,cpu 100%
  9. 海外开发者推荐:10个顶级2D游戏资源站
  10. java基础之多线程三:多线程并发同步