C#泛型约束(约束引用类型、约束值类型、约束无参构造函数、约束类或子类、泛型接口)

作者(出处):Lary发布时间:2015年4月15日 12:40:50查阅量:58

C#的六种类型的泛型约束:

◆T:结构

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

◆T:类

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

◆T:new()

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

◆T:<基类名>

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

◆T:<接口名称>

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

◆T:U

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyGeneric
{
    /// <summary>
    /// 泛型约束(约束引用类型、约束值类型、约束无参构造函数、约束类或子类、泛型接口)
    /// </summary>
    public class GenericConstraint
    {
        //where T : class 是一个引用类型,用where带出约束
        public static T Boy<T>(T t) where T : class
        { 
            //return default(T);
            return null; //引用类型可返回null默认值
        }

        //where T : struct 是一个值类型
        public static T Girl<T>(T t) where T : struct
        {
            return default(T);
        }

        //where T : class 是一个引用类型,用where带出约束,new()表示无参构造约束
        public static T Boys<T>(T t) where T : class,new()
        {
            //在泛型方法中调用无参构造函数
            People people = new People();
            T student = new T();
            
            //return default(T);

            //引用类型可返回null默认值
            return null;
        }

        //t必须是People类型或者People类型的子类
        public static void Hello<T>(T t) where T : People
        {
            //泛型方法被约束为People,在泛型方法内只能引用People的属性和方法
            Console.WriteLine("Id={0},Name={1}",t.Id,t.Name);
            t.Hello();
        }

        //泛型接口
        public interface ISayGoodbye<T>
        {
            void SayByeBye(T t);
        }
    }
}
百宝箱网络工作室  版权所有  
站长QQ:1617818397  站长E-mail:1617818397@qq.com
Powered by www.baibaox.com  Copyright © 2011-2018
点击这里给我发消息