C#2.0中的泛型约束(转载)
2007-12-03 13:55
281 查看
转载自http://wdxinren.cnblogs.com/archive/2005/05/29/164392.html
在上次的一篇翻译里已经简单介绍了一下C#2.0里的泛型。这次我们接着来了解C#泛型的一些特性。
这次介绍一下泛型的约束(Constraints)。
看一下代码:
public class Dictionary<K,V>
由于K可以任何类型,所以可想而知,key只能使用Object中定义的ToString等方法。代码在编译时就出错了,因为key可能不含有CompareTo方法。
那么如何解决呢?
一种容易想到的办法就是把key转换成IComparable,那么代码就变成了这样:
public class Dictionary<K,V>
这次没有编译时错误了。但是还是要小心,因为实际使用时,如果你使用了一个没有实现IComparable的类型作参数,就会出现InvalidCastException异常。
为了提供强编译时检查和减少类型转换,C#2.0泛型引入了约束(Constraints)这个概念,这是一个泛型的可选项。语法是使用where关键字指明约束的类型参数,然后加冒号,再加上类,接口,类型参数等。
我们把代码变成了这样:
public class Dictionary<K,V> where K: IComparable
这样就保证了任何为K类型参数提供的类型都实现了IComparable接口。所以我们的key就可以使用CompareTo方法了。
如果我们在使用时提供了没有实现IComparable接口的类型,就会出现编译时错误。
我们的约束可以不止是一个接口,可以是多个,还可以是跟类或其他约束混合。
请看下面代码:
public class EntityTable<K,E>
where K: IComparable<K>, IPersistable
where E: Entity, new()
对于约束new()可能不好理解。其实这个约束保证了提供给类型参数E的类型必须有一个public,无参的构造器。这样它就允许泛型类使用new E()创建这个类型的实例。
另外指出的是,虽然可以有多个接口作约束,但至多只能有一个类。
类型参数必须小心地使用。虽然它提供了更强编译时类型检查,但是却也约束了泛型类型的一些可能的使用情况。比如说,有一个泛型类List<T>约束T实现IComparable接口,这样就可以在List<T>的Sort方法中比较项了。然而,就不能为那些没有实现IComparable的类使用IList<T>了,就算Sort方法实际上并没有调用。
参考文献:《CSharp 2.0 Specification》
在上次的一篇翻译里已经简单介绍了一下C#2.0里的泛型。这次我们接着来了解C#泛型的一些特性。
这次介绍一下泛型的约束(Constraints)。
看一下代码:
public class Dictionary<K,V>
由于K可以任何类型,所以可想而知,key只能使用Object中定义的ToString等方法。代码在编译时就出错了,因为key可能不含有CompareTo方法。
那么如何解决呢?
一种容易想到的办法就是把key转换成IComparable,那么代码就变成了这样:
public class Dictionary<K,V>
这次没有编译时错误了。但是还是要小心,因为实际使用时,如果你使用了一个没有实现IComparable的类型作参数,就会出现InvalidCastException异常。
为了提供强编译时检查和减少类型转换,C#2.0泛型引入了约束(Constraints)这个概念,这是一个泛型的可选项。语法是使用where关键字指明约束的类型参数,然后加冒号,再加上类,接口,类型参数等。
我们把代码变成了这样:
public class Dictionary<K,V> where K: IComparable
这样就保证了任何为K类型参数提供的类型都实现了IComparable接口。所以我们的key就可以使用CompareTo方法了。
如果我们在使用时提供了没有实现IComparable接口的类型,就会出现编译时错误。
我们的约束可以不止是一个接口,可以是多个,还可以是跟类或其他约束混合。
请看下面代码:
public class EntityTable<K,E>
where K: IComparable<K>, IPersistable
where E: Entity, new()
对于约束new()可能不好理解。其实这个约束保证了提供给类型参数E的类型必须有一个public,无参的构造器。这样它就允许泛型类使用new E()创建这个类型的实例。
另外指出的是,虽然可以有多个接口作约束,但至多只能有一个类。
类型参数必须小心地使用。虽然它提供了更强编译时类型检查,但是却也约束了泛型类型的一些可能的使用情况。比如说,有一个泛型类List<T>约束T实现IComparable接口,这样就可以在List<T>的Sort方法中比较项了。然而,就不能为那些没有实现IComparable的类使用IList<T>了,就算Sort方法实际上并没有调用。
参考文献:《CSharp 2.0 Specification》
相关文章推荐
- C#2.0中的泛型约束
- 【整理】C#2.0泛型编程之概述、default()方法、别名指定与泛型约束
- 【转载】C#中的泛型 (From dotNet SDK 2.0 Beta1)
- C# 泛型编程之泛型类、泛型方法、泛型约束
- 系统的学习C#2.0中的泛型
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- C# 2.0与泛型
- C# 泛型和其中的new 约束
- c# in depth之泛型的类型约束详细
- C# 2.0:泛型
- 【C#】C#关键字-where(泛型类型约束)
- C#2.0_1->>泛型
- C#2.0 Specification(泛型一)
- C# 泛型约束List<T> (转)
- C# 泛型多种参数类型与多重约束 示例
- C#2.0泛型编程之强制类型转换、继承和泛型
- C# 泛型约束,泛型函数
- C# 2.0 Specification(泛型六)
- 转载:Asp.net 2.0 C#实现压缩/解压功能 (示例代码下载)
- C#2.0新特性-泛型