C#基礎 操作符之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

約束爲
約束類型爲struct的泛型約束調用
具體可看的介紹

構造函數約束

    /// <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用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章