惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
博客园 - 【当耐特】
GbyAI
GbyAI
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
腾讯CDC
F
Fortinet All Blogs
IT之家
IT之家
WordPress大学
WordPress大学
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Help Net Security
V
Visual Studio Blog
小众软件
小众软件
Y
Y Combinator Blog

博客园 - skylai

mvc3 小技巧 WCF学习之旅(一)---Hello World. WCF Client configuration Jquery表单验证 Jquery的一些常用信息 二进制、SOAP的序列化及反序列化 简单的Attribute实现. C#泛型之泛型委托 C#2.0泛型介绍之简单泛型类。 序列化之XML序列化(一) Vs2005的win form动态生成菜单 强制字符换行CSS版和C#版 js操作xml 读写XML文件 js的一些杂谈 一个button同时执行多个有返回值的函数的解决方法(return false; or return true;) DataGrid里应用radio单选按钮 限制字符输入(ASCII 码) 前两天刚看书看到的,来这里跟大家分享一下有关C#处理指令的问题
泛型之泛型约束
skylai · 2006-11-20 · via 博客园 - skylai

类型参数的约束
在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:

T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型.

T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

下面来用实例说明一下:
<基类名>;new();
先来定义一个类


    
public class Article
    
{
        
private string m_title;
        
private DateTime m_createdate;

        
public Article()
        
{
        }


        
public Article(string title)
        
{
            
this.m_title = title;
        }


        
public string Title
        
{
            
get
            
{
                
return this.m_title;
            }

            
set
            
{
                
this.m_title = value;
            }

        }


        
public DateTime CreateDate
        
{
            
get
            
{
                
return this.m_createdate;
            }

            
set
            
{
                
this.m_createdate = value;
            }

        }

    }

接下来就是泛型约束的实现

    //指定类型参数的类型约束,这里的参数只能是Article类,并且这个类要提供一个无参数的构造函数。
    public class GenericWhere<T> where T :Article, new()
    
{
        
private T m_genwhere;
        
//声明一个类型参数的属性
        public T GenWhere
        
{
            
get
            
{
                
return this.m_genwhere;
            }

            
set
            
{
                
this.m_genwhere = value;
            }

        }


        
public GenericWhere(T genW)
        
{
            
this.m_genwhere = genW;
        }

    }


    
public class GenericWhereApply
    
{
        
public void GencWhereMethod()
        
{
            Article art 
= new Article();
            GenericWhere
<Article> gw = new GenericWhere<Article>(art);
            
//这样就可以通赤gw的GenWhere属性访问Article的所有成员。
            string str = gw.GenWhere.Title;
        }

    }


其它几种类型的约束大概的用法都差不多,它们的类型参数都需要是受约束的类型。