在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
博客地址:https://www.cnblogs.com/zhengwk/p/5541921.html 六种类型的约束:
例子: 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.ogeek.net/article/37658.htm http://www.cnblogs.com/ottox/archive/2009/03/02/1401307.html http://www.ogeek.net/article/41143.htm 六种类型的约束:
例子: 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.ogeek.net/article/37658.htm http://www.cnblogs.com/ottox/archive/2009/03/02/1401307.html http://www.ogeek.net/article/41143.htm |
请发表评论