C#where关键字约束
C#where关键字约束
where关键词一个最重要的用法就是在泛型的声明、定义中做出约束。
约束又分为接口约束、基类约束、构造函数约束、函数方法的约束。
1.接口约束,泛型参数必须实现相应的接口才可以
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
public class Student : IStudent
{
private string name;
private int id;
//实现IStudnet接口
public string GetName
{
get
{
return name;
}
}
public int GetID
{
get
{
return id;
}
}
}
//接口约束,T必须是实现了IStudent接口的类
public class MyClass1<T> where T: IStudent
{
public MyClass1()
{
Console.WriteLine("接口约束构造成功!");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
public interface IStudent
{
string GetName{ get; }
int GetID { get; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
class Program
{
static void Main(string[] args)
{
MyClass1<Student> myclass1 = new MyClass1<Student>();
Console.ReadKey();
}
}
}
输出结果
接口约束构造成功!
2.基类约束,类型参数必须是指定的基类或派生自指定的基类,多用于继承体系之下
3.构造函数约束,对构造函数有一定的约束
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
public class Teacher:People
{
public Teacher() { }
public Teacher(string name,int age,string sex):base(name,age,sex)
{
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
public class People
{
public int Age { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public People() { }
public People(string name,int age,string sex)
{
Name = name;
Age = age;
Sex = sex;
}
}
//基类约束,T必须是People或者People的子类
public class MyClass2<T> where T:People
{
public MyClass2()
{
Console.WriteLine("基类约束构造成功");
}
}
//构造函数约束,T必须是引用类型,且必须具有无参构造函数
public class MyClass3<T> where T : class,new()
{
public MyClass3()
{
Console.WriteLine("构造函数约束构造成功");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace where约束程序
{
class Program
{
static void Main(string[] args)
{
MyClass2<Teacher> myclass2 = new MyClass2<Teacher>();
MyClass3<Teacher> myclass3 = new MyClass3<Teacher>();
//MyClass3<Student> myclass4 = new MyClass3<Student>();//由于Studnet中没有显示的声明构造函数,所以会自动生成一个默认的无参构造函数
Console.ReadKey();
}
}
}
总结:
- where T : struct 这表明T必须是一个值类型,像是int,decimal这样的
- where T : class 这表明T必须是一个引用类型,像是自定义的类、接口、委托等
- where T : new() 这表明T必须有无参构造函数,且如果有多个where约束,new()放在最后面
- where T : [base class name] 这表明T必须是base class类或者其派生类
- where T : [interface name] 这表明T必须实现了相应的接口
4556
漫思

浙公网安备 33010602011771号