C#where关键字约束

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必须实现了相应的接口

 

posted @ 2021-02-18 13:16  WellMandala  阅读(342)  评论(0编辑  收藏  举报