where(泛型類型約束)


定義:在定義泛型的時候,我們可以使用 where 限制參數的范圍。

使用:在使用泛型的時候,你必須尊守 where 限制參數的范圍,否則編譯不會通過。

 

六種類型的約束:

T:類(類型參數必須是引用類型;這一點也適用於任何類、接口、委托或數組類型。)

    class MyClass<T, U>
        where T : class///約束T參數必須為“引用 類型{ }”
        where U : struct///約束U參數必須為“值 類型”
    { }

T:結構(類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。)

    class MyClass<T, U>
        where T : class///約束T參數必須為“引用 類型{ }”
        where U : struct///約束U參數必須為“值 類型”
    { }

T:new()(類型參數必須具有無參數的公共構造函數。當與其他約束一起使用時,new() 約束必須最后指定。)

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}

T:<基類名>(類型參數必須是指定的基類或派生自指定的基類。)

public class Employee{}

public class GenericList<T> where T : Employee

T:<接口名稱>(類型參數必須是指定的接口或實現指定的接口。可以指定多個接口約束。約束接口也可以是泛型的。)

    /// <summary>
    /// 接口
    /// </summary>
    interface IMyInterface
    {
    }

    /// <summary>
    /// 定義的一個字典類型
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TVal"></typeparam>
    class Dictionary<TKey, TVal>
        where TKey : IComparable, IEnumerable
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val)
        {
        }
    }

T:U(為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。也就是說T和U的參數必須一樣

class List<T>
{
    void Add<U>(List<U> items) where U : T {/*...*/}
}

 

一、可用於類:

public class MyGenericClass<T> where T:IComparable { }

二、可用於方法:

public bool MyMethod<T>(T t) where T : IMyInterface { }

三、可用於委托:

delegate T MyDelegate<T>() where T : new()

 

在實際項目中什么時候用到它們?

有時候你在做一個項目的時候,你需要用到泛型,你只希望傳給你的泛型參數是限定范圍的,

比如你希望值類型,或者是引用類型,或者是繼承至某個類型、或者是符合某個接扣的類型,

這個時候你該如何辦?你就需要用到 WHERE 來限定了。

 

參考文檔:

https://msdn.microsoft.com/zh-cn/library/d5x73970.aspx

https://msdn.microsoft.com/zh-cn/library/bb384067.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM