where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
1.接口约束。
例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:

public class MyGenericClass<T> where T:IComparable { }

2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。
class MyClassy<T, U>
where T : class
where U : struct
{
}

3.where 子句还可以包括构造函数约束。
可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}
new() 约束出现在 where 子句的最后。

4.对于多个类型参数,每个类型参数都使用一个 where 子句,
例如:
interface MyI { }
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
public void Add(TKey key, TVal val)
{
}
}

5.还可以将约束附加到泛型方法的类型参数,例如:

public bool MyMethod<T>(T t) where T : IMyInterface { }

请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:

delegate T MyDelegate<T>() where T : new()

泛型的Where

  泛型的Where能够对类型参数作出限定。有以下几种方式。

  ·where T : struct 限制类型参数T必须继承自System.ValueType。
 
  ·where T : class 限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。

  ·where T : new() 限制类型参数T必须有一个缺省的构造函数

  ·where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。

  以上这些限定可以组合使用,比如: public class Point where T : class, IComparable, new()

C# where用法解析相关推荐

  1. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  2. mysql have_mysql having用法解析

    having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前.而 having子句在聚合后对组记录进行筛选. ...

  3. argparse.ArgumentParser()用法解析

    argparse.ArgumentParser()用法解析(https://blog.csdn.net/the_time_runner/article/details/97941409) https: ...

  4. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  5. python global和nonlocal用法解析

    这篇文章主要介绍了python global和nonlocal用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 global和nonlocal ...

  6. extern c用法解析

    extern "c"用法解析 字数1875 阅读38631 评论4 喜欢20 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟 ...

  7. extern C的用法解析

    extern "C"的用法解析 2012-03-20 23:29 by Rollen Holt, 20231 阅读, 6 评论, 收藏, 编辑 1.引言 C++语言的创建初衷是&q ...

  8. vsprintf用法解析

    vsprintf用法解析 原创 swif_N_F 最后发布于2017-12-04 09:43:14 阅读数 1703 收藏 发布于2017-12-04 09:43:14 分类专栏: C C++ 知识点 ...

  9. python legb_Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只 ...

  10. html如何让a标签提交表单提交,html post请求之a标签的两种用法解析

    这篇文章主要介绍了html post请求之a标签的两种用法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 html post请求之a标签的两种用法 ...

最新文章

  1. python中的运算符举例_举例讲解Python中的身份运算符的使用方法
  2. 登陆窗体与主窗体的跳转 C# (转载自网络)
  3. FPGA:下一代机器人感知处理器
  4. 分享AI有道干货 | 126 篇 AI 原创文章精选(ML、DL、资源、教程)
  5. 设计模式在项目中的应用案例_项目化学习案例(五):菊花种植的秘密——项目化学习在菊种植课程中的应用设计案例...
  6. 6 大技巧帮助初学者快速掌握 JavaScript!
  7. 345取出值怎么算角度_资料分析怎么提分?这几个公式你必须会!
  8. [ 原创 ]学习笔记-Android中隐式Intent 的使用
  9. 理解 JavaScript 的 async/await(转)
  10. pdfbox创建pdf_使用PDFBox处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)...
  11. 剑灵最新服务器2017,NCsoft2017新游戏计划 剑灵天堂M多款手游
  12. 王倩兮金碧山水作品《绿水青山就是金山银山》
  13. 5月27日 | 极客俱乐部:集成平台赋能业务流程再造与创新
  14. 测试过程中,遇到开发不认为是bug的bug,该怎么办
  15. python遥控汽车玩具_遥控小车
  16. Go实战--Gorilla web toolkit使用之gorilla/context
  17. 尚硅谷大数据开发Day02
  18. 头歌C++面向对象实训三
  19. 微信小程序 wepy 框架 手势密码 ios 安卓 真正的无卡顿
  20. 内存过大会影响计算机速度吗,内存容量过大会影响网速吗

热门文章

  1. mysql——JDBC
  2. 数据结构【插入操作具体代码的实现】
  3. 社交app应用开发 客户端+服务器源码
  4. 常用正则表达式和shell命令列表
  5. Linux(12)-命令行的使用,shell脚本
  6. 算法(6)-leetcode-explore-learn-数据结构-数组字符串的双指针技巧
  7. python(11)-if语句,断言assert
  8. 基于linux环境采用update-alternatives 方式进行python版本切换
  9. 学习较底层编程:动手写一个C语言编译器
  10. 2013科目三道路驾驶技能通用评判标准