C#泛型约束

六种类型的约束:html

T:结构编程

类型参数必须是值类型。能够指定除 Nullable 之外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)。数组

T:类函数

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

T:new().net

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

T:<基类名>htm

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

T:<接口名称>blog

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

T:U

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

 

例子:

1.接口约束。

例如,能够声明一个泛型类 MyGenericClass,这样,类型参数 T 就能够实现 IComparable<T> 接口:

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

2.基类约束。

指出某个类型必须将指定的类做为基类(或者就是该类自己),才能用做该泛型类型的类型参数。这样的约束一经使用,就必须出如今该类型参数的全部其余约束以前。

class MyClassy<T, U>
where T : class
where U : struct
{
}

3.构造函数约束。

以使用 new 运算符建立类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可让编译器知道:提供的任何类型参数都必须具备可访问的无参数(或默认)构造函数。new() 约束出如今 where 子句的最后。

public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
         T item = new T();
}

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 { }

6. 裸类型约束

用做约束的泛型类型参数称为裸类型约束。当具备本身的类型参数的成员函数须要将该参数约束为包含类型的类型参数时,裸类型约束颇有用。

class List<T>
{
void Add<U>(List<U> items) where U : T {/*...*/}
}

泛型类的裸类型约束的做用很是有限,由于编译器除了假设某个裸类型约束派生自 System.Object 之外,不会作其余任何假设。在但愿强制两个类型参数之间的继承关系的状况下,可对泛型类使用裸类型约束。

7.default关键字

之因此会用到default关键字,是由于须要在不知道类型参数为值类型仍是引用类型的状况下,为对象实例赋初值。考虑如下代码:

class TestDefault<T>
    {
        public T foo()
        {
            T t = null; //???
            return t;
        }
    }

若是咱们用int型来绑定泛型参数,那么T就是int型,那么注释的那一行就变成了 int t = null;显然这是无心义的。为了解决这一问题,引入了default关键字:

class TestDefault<T>
    {
        public T foo()
        {
                return default(T);
        }
    }

参考:http://www.jb51.net/article/37658.htm

http://www.cnblogs.com/ottox/archive/2009/03/02/1401307.html

http://www.jb51.net/article/41143.htm

相关文章
相关标签/搜索