Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
尚未分类 LINQ教程 Enterprise技术 性能优化/调试 水晶报表与打印 安全与加密 图形图像 文件处理 基础教程 Web Services 内置对象 控件示例 正则表达式\采集 ADO.NET缓存\泛型\线程 XML技术 Url重写\静态页 vs2008综合教程

C#中的where泛型约束中的new()构造函数约束

时间:2011-11-30 18:27来源:未知 作者:admin 点击:

在MSDN上面对new()解释说到是where字句的构造函数约束,带有new()约束的任何类型都必须有可访问的无参构造函数,正常来说C#创建的类默认都有一个无参的构造函数,即使你没有写,但是如果你写了一个有参数的构造函数后,那么就没有默认无参的那个了,就需要自己手动写一个。

还是拿前两天的国籍那个举个例子:
1 /// <summary>
2 /// 国籍的接口
3 /// </summary>
4 public interface INationality
5 {
6     string Nationality
7     {
8         set;
9     }
10     string GetNationality();
11 }
国籍的接口不用改变还是这个,继承此接口的类稍微修改了一下,为每个类增加一个构造方法,改造如下:
1 /// <summary>
2 /// 中国人
3 /// </summary>
4 public class Chinese : INationality
5 {
6     public Chinese(string DefaultNationality)
7     {
8         _Nationality = DefaultNationality;
9     }
10     private string _Nationality;
11     public string Nationality
12     {
13         set
14         {
15             _Nationality = value;
16         }
17     }
18
19     public string GetNationality()
20     {
21         return string.IsNullOrEmpty(_Nationality) ? "Chinese." : _Nationality;
22     }
23 }
24
25 /// <summary>
26 /// 美国人
27 /// </summary>
28 public class American : INationality
29 {
30     public American(string DefaultNationality)
31     {
32         _Nationality = DefaultNationality;
33     }
34     private string _Nationality;
35     public string Nationality
36     {
37         set { _Nationality = value; }
38     }
39
40     public string GetNationality()
41     {
42 return string.IsNullOrEmpty(_Nationality) ? "American." : _Nationality;
43     }
44 }
其实变动也不大,泛型类也没有修改,但是会报错,在创建实例化对象的地方,如下:
1 /// <summary>
2 ///
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class PrintNationality<T> where T : INationality, new()//由于此处有new()的约束,所以编译器编译的时候无法通过,那么就将new()去掉,或者为继承INationality的类增加public类型的无参构造函数
6 {
7     //T item = new T();     在这个地方就不能创建实例化对象了,会提示错误“必须有具有公共无参构造函数的非抽象类型,才能用作泛型类型或方法"xxxx"中的参数T”
8     public void Print()
9     {
10         //Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality()));
11     }
12 }
要解决上面的问题,就是给继承INationality的接口的每个类都增加一个无参的public型的构造方法,或者,将派生类后面的new()去掉。这样的话,当实例化泛型类的时候就不会有问题了。
上面写那么多也是举一个小例子,其实MSDN说的很明白,就是where字句后面有new()约束的话,T类型必须有公有的无参的构造函数。
Tags:泛型
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价
  • 黑马程序员—多线程的总体概括和总结

    多线程的总体概括和总结 ...

  • C#中的where泛型约束中的new()构造函数约束

    在MSDN上面对new()解释说到是 where 字句的构造函数约束,带有new()约束的任何类型都必须有可访问的无参构造函数,正常来说 C# 创建的类默认都有...

  • C#泛型List随机排列

    有时候得到了一个List,我想把它随机排列一下顺序。而且如果针对不同类型的List都能用,就要用到泛型。 其实思想很简单,就是从原List中每次随机取一项,添加...

  • C#往线程里传参数的方法总结

    Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。 Thread ...

  • 表达式树和泛型委托

    表达式树和泛型委托 ...

  • 泛型委托在项目中的应用

    泛型委托在项目中的应用 ...

  • C#多线程与异步的区别

    C#多线程与异步的区别...

  • ASP.NET2.0泛型和匿名方法

    泛型: 泛型概述:泛型可应用于类、方法、结构、接口、委托等设计中,兼复用性、类型安全和高效率于一身是与之对就的非泛型所不及的应用泛型,必须使用类System.C...

  • ASP.NET缓存数据添加方法一览

    ASP.NET使用缓存机制,将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。缓存是有Cache类实现的,可以通过对缓存...

  • 线程的事件通知

    Thread类并没有定义事件。有时需要在某个线程内等待某事件,怎么办呢?dotnet提供这种支持,这要用到:AutoResetEvent类。使用方法如下: us...

  • C#泛型编程

    泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用参数化类型将类型抽象化,从而实现灵活的复用。 例子代码: class Program { stat...

  • C#多线程汇总

    一、线程的基本概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。 ...

  • 一个泛型实例

    class StackT { T[] buffer; int count; public void Push(T value) { buffer[count++...

  • 几个线程同步对象方法

    在编写多线程程序时无可避免会遇到线程的同步问题。什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B...

  • ASP.NET页面缓存的几点体会

    我的一个ASP.NET页面用window.open导航后再次访问时没有得到更新,确切的说是再次访问时根本就没有访问服务器。可是这个现象在我的机器上并没有出现,而...

  • 线程中用到HttpContext.Current的方法封装

    1.缓存(Cache):我们通常会从System.Web.HttpContext.Current.Cache获取,但是在线程中我们所得到的HttpContext...

  • asp.net缓存技术

    在 ASP.NET 提供的许多特性中,缓存支持无疑是我最欣赏的特性,我这样说当然是有充分理由的。相比 ASP.NET 的所有其他特性,缓存对应用程序的性能具有最...

  • Asp.Net中Cache操作类的使用

    /// head /// function /// 存储类(存储UserInfo信息) /// /function /// description /// 用C...

  • Asp.Net中Cache操作类

    /// /// /// 存储类(存储UserInfo信息) /// ///

  • ASP.net页面缓存而部分不缓存

    在ASP.NET中要实现部分内容非缓存,而其它的都需要缓存输出,可以使用Substitution控件实现. 文件1:Deafault.aspx %@PageLa...

  • C# 2.0泛型编程基础

    泛型的基本概念。 从而使我实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型平安,更高的效率,不过在约束方面,只支持显示的约束,这样在灵活性方面...