什么是泛型的主要约束和次要约束

分析问题

  当一个泛型参数没有任何约束时,它可以进行的操作和运算是非常有限的,因为不能对实参做任何类型上的保证,这时候就需要用到泛型的约束。泛型的主要约束和次要约束都是指泛型的实参必须满足一定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满足约束条件。

  一个泛型参数可以至多拥有一个主要约束,主要约束可以是一个引用类型、class或者struct。如果指定一个引用类型,则实参必须是该类型或者该类型派生类型。class规定实参必须是一个引用类型。struct规定了参数必须是一个之类新。以下代码是泛型参数主要约束的示例。

using System;

namespace Test
{
    class GenericPrimaryConstraint
    {
        static void Main()
        {
            Console.Read();
        }
    }
    //主要约束限定T继承自Exception类型
    public class ClassT1<T> where T : Exception
    {
        private T myException;
        public ClassT1(T t)
        {
            myException = t;
        }
        public override string ToString()
        {
            //主要约束保证了myException拥有Source成员
            return myException.Source;
        }
    }
    //主要约束限定T是引用类型
    public class ClassT2<T> where T : class
    {
        private T myT;
        public void Clear()
        {
            //T是引用类型,可以置null
            myT = null;
        }
    }
    //主要约束限定T是值类型
    public class ClassT3<T> where T : struct
    {
        private T myT;
        public override string ToString()
        {
            //T是值类型,不会发生NullReferenceException异常
            return myT.ToString();
        }
    }
}

  以上代码,泛型参数具备了主要约束后,就能够在类型中对其进行一定的操作,否则任何算法就只能基于一个System.Object类型的成员。

  可以说,主要约束是实参类型的限定,而相对的次要约束,则是指实参实现的接口的限定。对于一个泛型类型,可以有0至无限的次要约束,次要约束规定了参数必须实现所有次要约束中规定的接口。次要约束的语法和主要约束基本一致,区别仅在于提供的不是一个引用类型而是一个或多个接口。

注意

  同时拥有主要约束和次要约束的泛型参数,表示实参必须同时满足主要约束和次要约束。

答案

  每个泛型参数可以有至多一个主要约束,泛型的主要约束是指泛型参数必须是或者继承自某个引用类型,有两个特殊的主要约束:class和struct,分别代表泛型参数是引用类型和值类型。

  每个泛型参数可以有无限个次要约束,次要约束和主要约束的语法基本相同,但它规定的是某个泛型参数必须实现所有次要约束指定的接口。

什么是泛型的主要约束和次要约束

时间: 2024-10-13 10:05:06

什么是泛型的主要约束和次要约束的相关文章

SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主键. SQL PRIMARY KEY Constraint on CREATE TABLE 下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束: MySQL: CREATE TABLE Persons ( Id_P i

iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画

首先感谢众多网友的支持,最近我实在是事情太多,所以没有写太多.不过看到大家的反馈和评价,我还是要坚持挤出时间给大家分享我的经验.如果你对我写的东西有任何建议.意见或者疑问,请到我的博客留言: http://blog.csdn.net/pucker 好了,言归正传.本系列的前几篇文章讲解了自动布局的原理,以及如何添加约束.这篇文章主要介绍以下内容: 某些用户控件具有自身内容尺寸约束 使用视图调试工具在运行时查看和调试程序界面视图层次.尺寸和自动布局约束 创建约束的对象关联 通过修改约束的常量值.删

SQL Server缺省约束、列约束和表约束

SQL Server缺省约束是SQL Server数据库中的一种约束,下面就为您介绍SQL Server缺省约束.列约束和表约束的定义方法啊,供您参考. SQL Server缺省约束 SQL Server缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值.SQL Server 推荐使用缺省约束,而不使用定义缺省值的方式来指定列的缺省值. 定义SQL Server缺省约束的语法如下:CONSTRAINT constraint_nameDEFAULT constant_e

SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束

CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... ) 数据类型(data_type)规定了列可容纳何种数据类型.下面的表格包含了SQL中最常用的数据类型: 数据类型 描述 integer(size) int(size) smallint(size) tinyint(size) 仅容纳整数.在括号内规定数字的最

创建与删除SQL约束或字段约束

1)禁止所有表约束的SQLselect 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'2)删除所有表数据的SQLselect 'TRUNCATE TABLE '+name from sysobjects where type='U'3)恢复所有表约束的SQLselect 'alter table '+name+' check constraint all' from sysobjects w

MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_stude

主键约束和唯一性约束

主键约束和唯一性约束都是索引,它们的区别是: 主键字段可以确保唯一性,但主键字段不能为NULL. 唯一性约束可以确保唯一性,但唯一性约束的字段可以为NULL 唯一性约束对含有NULL的记录不起作用,即可以重复加入含有NULL的记录,主键字段不能为NULL mysql-workbench无法创建多字段唯一性约束,可以在命令行手工增加增加多字段唯一性性约束mysql>alter table cmd_end_regexp add constraint dev_series_uniq UNIQUE(de

Oracle数据库,非空约束、主键约束、外键约束、唯一约束

非空约束:设置列时,可为空默认可为空,去掉对号之后设置数据不可为空: 唯一约束:在键中设置,唯一约束名称.类型Unique.列名:设置应用完成之后,此列数据具有唯一性:即数据不可重复 主键约束:主键列自动具有非空约束和唯一约束,一个表只能有一个主键约束(自动生成索引,提高查询效率)

Schema约束与DTD约束

现将Schema约束与DTD约束实现的一个实例截图出来: 1.DTD 1.1 DTD文件 1.2 DTD实现 2.Schema 2.1 Schema约束 2.2 Schema实现