C# where的用法 泛型约束
程序员文章站
2022-06-16 08:18:56
...
Where的使用
啥叫泛型约束:就是你必须要符合这个规则来,不然就不让你编译通过 。
以上见解来自水木大哥
我们经常可以看到这样的代码
public class InterfaceRestrict<T> where T : IComparable
{
}
而T后面跟的是泛型约束,这个案例的意思是,代入的类T必须是实现了IComparable接口的类
以下来介绍泛型约束中where 的用法
接口约束
/// <summary>
/// 接口约束
/// </summary>
/// <typeparam name="T"></typeparam>
public class InterfaceRestrict<T> where T : IComparable
{
}
接口约束:限定代入的参数,必须是实现了某个接口(本代码是指IComparable)的类,否则报错
实现IComparable接口的类
/// <summary>
/// 实现IComparable接口的类
/// </summary>
public class ComparableClass : IComparable
{
public int CompareTo(object obj)
{
throw new NotImplementedException();
}
}
调用代码如下
//接口约束
var interfaceRestric = new InterfaceRestrict<ComparableClass>();
基类约束
class BaseClassRestric<T> where T : struct
{
}
基类约束:限定代入的参数T,必须是某种基类型的数据,否则报错.
上述代码是限制了带入的参数必须要struct类型的数据(此处到现在可以这么理解)
结构体
/// <summary>
/// 测试结构体
/// </summary>
struct TestStruct
{
}
调用代码如下
//基类约束
var baseClassRestrict = new BaseClassRestric<TestStruct>();
值得一提的是,基类约束中:
如果约束类别为class,则可以看作是约束引用类型,所以带入的参数可以是任何类、接口、委托或数组类型.(因为这些参数,都是类)
如果约束类别为struct,则可以看作是约束值类型,所以带入的参数可以是任何简单值类型(int,byte),DateTime,Enum
具体可看梦的介绍
构造函数约束
/// <summary>
/// 函数约束,说明T函数必须要有一个无参的构造函数
/// </summary>
/// <typeparam name="T"></typeparam>
class FunctionRestrict<T> where T : new()
{
}
基类约束:限定代入的参数T,必须是有一个无参的构造函数,否则报错
/// <summary>
/// 有参构造类
/// </summary>
class HaveParaConstruClass
{
public HaveParaConstruClass(string str)
{
}
}
/// <summary>
/// 无参构造类
/// </summary>
class NonParaConstruClass
{
public NonParaConstruClass()
{
}
}
调用
//构造函数约束
//带入有参构造类,会报错
// var functionRestrict = new FunctionRestrict<HaveParaConstruClass>();
var functionRestrict = new FunctionRestrict<NonParaConstruClass>();
多类型约束
class MultiTypeRestrict<T, U> where T : class
where U : struct
{
}
多类型约束:所谓多类型约束,其实就是泛型约束中,有多个约束参数,在使用中,只要用where连接即可
PS:泛型约束在C#源码中非常常见,还是有必要去学会基本使用的.
本文章借鉴
C# where用法