【C#食谱】【面食】菜单6:泛型约束
2008-03-11 11:31
519 查看
问题:
你希望你的泛型类型在创建的时候必须有一个支持某个接口(比如IDisposable接口)成员的类型参数。
解决方法:
使用约束去强制泛型的类型参数实现某一个或多个特定的接口。
public class DisposableList<T> : IList<T>
where T : IDisposable
public static void TestDisposableListCls()
public class DisposableList<T> : IList<T>
where T : IDisposable
这意味着,下面的代码将编译成功:
DisposableList<StreamReader> dl = new DisposableList<StreamReader>();
但这个就不行了:
DisposableList<string> dl = new DisposableList<string>();
这是因为string并没有实现IDisposable接口,而StreamReader实现了。
除了要求一个或多个接口被实现,其他对于类型参数的约束也是被允许的。你可以要求一个类型参数必须继承自一个特定的基类,比如Textreader类:
public class DisposableList<T> : IList<T>
where T : System.IO.TextReader, IDisposable
你也可以约束这个类型参数只能是值类型或者只能是引用类型。下面声明的类的约束是其只能使用值类型:
public class DisposableList<T> : IList<T>
where T : struct
而这个是只能使用引用类型:
public class DisposableList<T> : IList<T>
where T : class
除此之外,你也可以要求任何类型参数去实现一个公共的默认构造函数:
public class DisposableList<T> : IList<T>
where T : IDisposable, new()
使用约束使得你可以编写的泛型只能接受那些更具体的有用的参数类型。如果在这个示例中,IDsiposable约束被省略,那么一个编译时错误将会发生。这是因为,不是所有的类型它都可以被用作是实现了IDisposable接口的DisposableList类的参数的。如果你忽略这个编译时检查,一个DisposableList对象也许会包含那些并没有一个公共的无参数的Dispose方法的对象。在这种情况下,一个运行时异常将会发生。泛型和约束在一定程度上要求严格的参数类型检查,这使你在编译时就可以发现这些问题,而不是运行时。
你希望你的泛型类型在创建的时候必须有一个支持某个接口(比如IDisposable接口)成员的类型参数。
解决方法:
使用约束去强制泛型的类型参数实现某一个或多个特定的接口。
public class DisposableList<T> : IList<T>
where T : IDisposable
public static void TestDisposableListCls()
public class DisposableList<T> : IList<T>
where T : IDisposable
这意味着,下面的代码将编译成功:
DisposableList<StreamReader> dl = new DisposableList<StreamReader>();
但这个就不行了:
DisposableList<string> dl = new DisposableList<string>();
这是因为string并没有实现IDisposable接口,而StreamReader实现了。
除了要求一个或多个接口被实现,其他对于类型参数的约束也是被允许的。你可以要求一个类型参数必须继承自一个特定的基类,比如Textreader类:
public class DisposableList<T> : IList<T>
where T : System.IO.TextReader, IDisposable
你也可以约束这个类型参数只能是值类型或者只能是引用类型。下面声明的类的约束是其只能使用值类型:
public class DisposableList<T> : IList<T>
where T : struct
而这个是只能使用引用类型:
public class DisposableList<T> : IList<T>
where T : class
除此之外,你也可以要求任何类型参数去实现一个公共的默认构造函数:
public class DisposableList<T> : IList<T>
where T : IDisposable, new()
使用约束使得你可以编写的泛型只能接受那些更具体的有用的参数类型。如果在这个示例中,IDsiposable约束被省略,那么一个编译时错误将会发生。这是因为,不是所有的类型它都可以被用作是实现了IDisposable接口的DisposableList类的参数的。如果你忽略这个编译时检查,一个DisposableList对象也许会包含那些并没有一个公共的无参数的Dispose方法的对象。在这种情况下,一个运行时异常将会发生。泛型和约束在一定程度上要求严格的参数类型检查,这使你在编译时就可以发现这些问题,而不是运行时。
相关文章推荐
- 【C#食谱】【面食】菜单7:用默认值初始化泛型变量
- 【C#食谱】【面食】菜单1: 何时何地使用泛型
- 【C#食谱】【面食】菜单2:理解泛型
- 【C#食谱】【面食】菜单3:用泛型替代ArrayList
- 【C#食谱】【面食】菜单5:用泛型副本替换哈希表
- 【C#食谱】【面食】菜单4:List和LinkedList性能比较
- C# 泛型约束List<T> (转)
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
- C#泛型约束
- 关于C#中泛型类型参数约束(where T : class)
- C# 泛型 引用类型约束 值类型约束
- c# in depth之泛型的类型约束详细
- 【C#食谱】【风味小吃】菜单2:角度转换为弧度
- C#中的where泛型约束
- where(泛型类型约束)(C# 参考)
- C#2.0中的泛型约束
- 【整理】C#2.0泛型编程之概述、default()方法、别名指定与泛型约束
- C# 泛型,泛型约束,泛型接口
- c# 泛型类型参数T的约束where
- C# 泛型多种参数类型与多重约束 示例