定義:在定義泛型的時候,我們可以使用 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()

