您的位置:首页 > 编程语言 > C#

【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方法的对象。在这种情况下,一个运行时异常将会发生。泛型和约束在一定程度上要求严格的参数类型检查,这使你在编译时就可以发现这些问题,而不是运行时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: