• Generic 类型参数和约束的规则


    1.      泛型类可以从具体的、封闭式构造或开放式构造基类继承

        class BaseNode { }

        class BaseNodeGeneric<T> { }

     

        // concrete type

        class NodeConcrete<T> : BaseNode { }

     

        //closed constructed type

        class NodeClosed<T> : BaseNodeGeneric<int> { }

     

        //open constructed type

        class NodeOpen<T> : BaseNodeGeneric<T> { }

    2.      非泛型类(换句话说,即具体类)可以从封闭式构造基类继承

    无法从开放式构造类型,运行时客户端代码无法提供基类所需的参数类型

     

    //No error

        class Node1 : BaseNodeGeneric<int> { }

     

        //Generates an error

        //class Node2 : BaseNodeGeneric<T> {}

     

        //Generates an error

        //class Node3 : T {}

     

    3.      从开放式构造类型继承的泛型类必须为任何未被继承类共享的基类类型参数提供类型变量

         class BaseNodeMultiple<T, U> { }

     

        //No error

        class Node4<T> : BaseNodeMultiple<T, int> { }

     

        //No error

        class Node5<T, U> : BaseNodeMultiple<T, U> { }

     

        //Generates an error

        //class Node6<T> : BaseNodeMultiple<T, U> {}

     

     

    4.      从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束:

     class NodeItem<T> where T : System.IComparable<T>, new() { }

        class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

    5.      泛型类型可以使用多个类型参数和约束

       class SuperKeyType<K, V, U>

            where U : System.IComparable<U>

            where V : new()

        { }

    6.      开放式构造类型和封闭式构造类型可以用作方法参数

    class myGenericA<T>

        {

            void Swap<T>(List<T> list1, List<T> list2)

            {

                //code to swap items

            }

     

            void Swap(List<int> list1, List<int> list2)

            {

                //code to swap items

            }

        }

    7.      如果某个泛型类实现了接口,则可以将该类的所有实例强制转换为该接口

    8.      泛型类是不变的

    static void TestGenericBaseClass()

            {

                //Generate an error

                List<object> myList = new List<string>();

                //无法将类型System.Collections.Generic.List<string>隐式转换为System.Collections.Generic.List<object>

     

              

            }

  • 相关阅读:
    哈夫曼树
    粒子群算法(1)----粒子群算法简单介绍
    白话经典算法系列之七 堆与堆排序
    UVa 11879
    有计划,公司运行——写到犹豫大三女生
    _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
    s3c2440的A/D转换应用
    iSwifting如何发送照片社区
    【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
    于Unity3D动态创建对象和创建Prefab三种方式的原型对象
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1569848.html
Copyright © 2020-2023  润新知