美文网首页unity面试题
C# 泛型的逆变与协变

C# 泛型的逆变与协变

作者: 若能遇见 | 来源:发表于2020-12-12 14:28 被阅读0次

泛型参数的输入与输出

  如果泛型参数不带任何修饰符,那么在分配对象时,类型参数只能是固定的类型。

    // B从A派生
    Class<A> x = new Class<A>();
    Class<A> x = new Class<B>(); // 编译错误`

  这需要泛型的参数类型成为变体,需要in和out修饰符。

  • in:输入类型,逆变,一般用于委托或方法的输入参数。
    逆常的变,不自然地变化,父类->子类

  • out:输出类型,协变,一般用于委托或方法的返回值。
    和谐的变,很自然地变化,子类->父类

    子类派生于父类,派生程度大,拥有父类所拥有的,所以和谐的转换成父类。

    public class Program
    {
        public static void Main(string[] args)
        {
            // 逆变
            ITest1<B> t1 = new Test1<A>();

            // 协变
            ITest2<A> t2 = new Test2<B>();
        }
        // 示例类型
        public class A { }
        public class B : A { }

        // 带变体的接口
        public interface ITest1<in T> { }
        public interface ITest2<out T> { }

        // 实现类
        public class Test1<T> : ITest1<T> { }
        public class Test2<T> : ITest2<T> { }
    }
}

相关文章

  • Kotlin学习笔记 - 泛型

    1. 基本用法 2. 型变 型变包括 协变、逆变、不变 三种: 协变:泛型类型与实参的继承关系相同 逆变:泛型类型...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • C# 中泛型接口的协变和逆变(抗变)

    在C#中声明泛型接口时,我们可以使用 in 和 out 参数来控制这个泛型是协变还是逆变的,这里逆变有时也被翻译成...

  • Java协变和逆变

    泛型的协变与逆变 协变与逆变用来描述类型转换(type transformation)后的继承关系,其定义如下:如...

  • Scala 通俗易懂 ---- 协变、逆变、不变

    协变、逆变、不变 Scala 语言中协变、逆变、不变是指拥有泛型的类型,在声明和赋值时的对应关系 协变:声明时泛型...

  • JAVA泛型与类型安全

    1. 基础泛型 2. 协变与逆变与不变 协变 简单来说即: Java中的数组是协变的 逆变与协变相对,逆转了类型关...

  • Scala 泛型协变与泛型边界

    代码准备 泛型协变 泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。 协变:声明时泛型是父类,赋值时...

  • Java 泛型与通配符

    参考地址:《Java 泛型,你了解类型擦除吗?》 《Java中的逆变与协变》 《java 泛型中 T、E .....

  • Java中的桥接方法与泛型的逆变和协变

    泛型的协变和逆变是什么?对应于Java当中,协变对应的就是,而逆变对应的就是

  • 协变和逆变

    Java的泛型只有通配符?和extends、super,没有语法上的协变和逆变。 什么是协变和逆变? 在混合OO和...

网友评论

    本文标题:C# 泛型的逆变与协变

    本文链接:https://www.haomeiwen.com/subject/jsaygktx.html