zoukankan      html  css  js  c++  java
  • 【协变】和【逆变】的简单示例

    注意:无论【协变】还是【逆变】都能 保证类型安全

     1 static void Main(string[] args)
     2 {
     3     //==>【协变】:子类泛型赋值给父类泛型 (返回值的时候使用)
     4     //前提是类型参数有 out 修饰:public interface IQueryable<out T>
     5     IQueryable<string> a = null;
     6     IQueryable<object> b = a; //这里就是【协变】
     7 
     8     //==>【逆变】:父类泛型赋值给子类泛型 (传参数的时候使用)
     9     //前提是类型参数有 in 修饰:public delegate void Action<in T>(T obj);
    10     Action<object> c = null;
    11     Action<string> d = c; //这里就是【逆变】
    12     d("target");//这一行是理解关键,注意实际是谁在使用"target"参数就能理解【逆变】
    13 
    14     //==>【最后提醒一句】像List<T>这样的泛型类,由于声明时没有 in或out 修饰泛型参数,所以不存在【协变】和【逆变】
    15     //public class List<T>
    16     List<string> e = null;
    17     List<object> f = e; //不存在【协变】,编译时就会报错
    18     List<object> h = null;
    19     List<string> i = h; //不存在【逆变】,编译时就会报错
    20 }
  • 相关阅读:
    java 编译
    MapReduce
    搜索引擎中index、attribute和summary概念
    正排索引和倒排索引简单介绍
    SVN 使用
    PlantUML + Chrome 联合使用
    vim 多标签和多窗口
    关于数据库不适合docker的原因(摘抄)
    跨域
    is_valid校验机制
  • 原文地址:https://www.cnblogs.com/techliang666/p/8018383.html
Copyright © 2011-2022 走看看