zoukankan      html  css  js  c++  java
  • c# in depth之泛型的类型约束详细

    类型约束

    1.引用类型约束

    这种约束(表示成T:class,必须是为类型参数指定的第一个约束)用于确保使用的类型实参是引用类型,这可能是任何类,接口,数组,委托或者已知是引用类型的另一个类型参数。

    例如  struct RefSample<T> where T:class

    有效的封装类型包括:

    RefSample<IDisposable>;

    RefSample<string>;

    RefSample<int[]>;

    无效的封装类型包括:

    RefSample<Guid>

    RefSample<int>

    2.值类型约束

    这种约束(表示成T:struct)可以确保使用的类型实参是值类型,其中包括枚举。但是,它将可空类型排除在外。

    例如 class  ValSample<T> where T:struct

    有效的封装类型包括:

    ValSample<int>

    ValSample<FileMode>

    无效的封装类型包括:

    ValSample<object>

    ValSample<string>

    3.构造函数类型约束

    这种约束(表示为T:new(),必须是所有类型参数的最后一个约束)仅核对所有类型实参有一个无参的构造函数,这个构造函数可用于创建类型的实例。这适用于:所有的值类型;所有非静态、非抽象、没有显示声明的构造函数的类;显示声明了一个公开的无参构造函数的所有非抽象类。

    例子:

    public T CreateInstance<T>() where T:new()

    {

      return new T();

    }

    有效的实例包括

    CreateInstance<int>()

    CreateInstance<object>()

    无效的实例

    CreateInstance<string>()

    因为string没有无参构造函数

    没有办法规定类型参数必须具备其他构造函数的签名,例如不能指定类型参数必须拥有一个以单个字符串作为参数的构造函数。

    4.转换类型约束

    这种约束允许你指定另一个类型,类型实参必须可以通过一致性引用或者装箱转换隐式地转换为该类型。还可以规定一个类型实参必须可以转换为另一个类型实参,这称为类型参数约束。

    例子

    class Sample<T> where T:Stream

    有效:Sample<Stream> (一致性转换)

    无效:Sample<string>

    class Sample<T> where T:IDisposable

    有效:Sample<SqlConnection>(引用转换)

    无效:Sample<StringBuilder>

    class Sample<T> where T:IComparable<T>

    有效:Sample<int> (装箱转换)

    无效:Sample<FileInfo>

    class Sample<T,U> where T:U

    有效:Sample<Stream,IDisposable>

    无效:Sample<string,IDisposable>

    任何类型都不能直接派生自多个类。对于这样的约束,要么是永远无法满足的,要么它的一部分是多余的。

    5.组合约束

    没有任何类型既是值类型又是引用类型。所以像这样的组合是禁止的。另外,由于每一个值类型都有一个无参构造函数,所以假如已经有一个值类型约束,就不允许再指定一个构造函数约束。如果存在多个转换类型约束,并且其中一个为类,那么它应该出现在接口的前面,而且我们不能多次指定同一个接口。不同的类型参数可以有不同的约束,它们分别由一个单独的where引入

    有效的例子

    class Sample<T> where T:class,IDisposale,new()

    class Sample<T> where T:struct,IDisposable

    class Sample<T> where T:class where U:struct,T

    class Sample<T> where T:Stream where U:IDisposable

    无效的例子

    class Sample<T> where T:class,struct

    class Sample<T> where T:Stream,class

    class Sample<T> where T:new(),Stream

    class Sample<T> where T:IDisposable,Stream

    class Sample<T> where T:XmlReader,IComparable,IComparable

    class Sample<T> where T:struct where U:class,T

    class Sample<T> Stream,U:IDisposable

    本文整理自:c# in depth

    IDisposable接口用法请参阅:

    http://blog.sina.com.cn/s/blog_66998b3f0100vwkn.html

  • 相关阅读:
    jenkins 参数化构建,获取git分支
    maven 历史版本下载
    spring mybatis 多个数据源配置
    springmvc 加载静态文件失败
    java服务覆盖率统计 jacoco ant
    testng监听ISuiteListener
    记录一下这几天遇到的坑(.netcore 代理问题)
    Js获取客户端用户Ip地址
    如何获取AWS的Access Key ID 和 Secret Access Key (Unable to find credentials)
    记录一个EF连接查询的异常:the entity or complex type 'x' cannot be constructed in a linq to entities query
  • 原文地址:https://www.cnblogs.com/wjcnet/p/3417290.html
Copyright © 2011-2022 走看看