c#泛型类型参数的约束 where

一、原地址

微软C#开发指南:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

网上大佬的地址:https://blog.csdn.net/sjb2mln/article/details/76585579

二、介绍

1、约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 Object 的成员,它是任何 .NET 类型的最终基类。 有关详细信息,请参阅使用约束的原因如果客户端代码尝试使用约束所不允许的类型来实例化类,则会产生编译时错误。 通过使用 where 上下文关键字指定约束。

2、下表列出了七种类型的约束:

约束

说明

where T : struct

类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关详细信息,请参阅使用可以为 null 的类型

where T : class

类型参数必须是引用类型。 此约束还应用于任何类、接口、委托或数组类型。

where T : unmanaged

类型参数不能是引用类型,并且任何嵌套级别均不能包含任何引用类型成员。

where T : new()

类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。

where T : <基类名>

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

where T : <接口名称>

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

where T : U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

某些约束是互斥的。 所有值类型必须具有可访问的无参数构造函数。 struct 约束包含 new() 约束,且 new() 约束不能与 struct 约束结合使用。 unmanaged 约束包含 struct 约束。 unmanaged 约束不能与 structnew() 约束结合使用。

3、使用约束的原因

通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。 设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则必须对该类型参数应用约束。 例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。 编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。

猜你喜欢

转载自www.cnblogs.com/masonblog/p/9541110.html