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

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Recent Announcements
Recent Announcements
IT之家
IT之家
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
U
Unit 42
罗磊的独立博客
博客园 - Franky
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
SecWiki News
SecWiki News
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
P
Palo Alto Networks Blog
F
Fortinet All Blogs
P
Proofpoint News Feed
博客园 - 叶小钗
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
Spread Privacy
Spread Privacy
S
Securelist
C
Cisco Blogs
I
Intezer
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
T
Troy Hunt's Blog
T
Threatpost
博客园 - 司徒正美
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
AWS News Blog
AWS News Blog
T
The Blog of Author Tim Ferriss
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
S
SegmentFault 最新的问题

博客园 - 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;
        }

    }


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