C#中where的用法


where 子句用於指定類型約束,這些約束可以作為泛型聲明中定義的類型參數的變量,也就是說用來約束泛型的

約束告知編譯器類型參數必須具備的功能。 在沒有任何約束的情況下,類型參數可以是任何類型。 編譯器只能假定 System.Object 的成員,它是任何 .NET 類型的最終基類。

1、接口約束:
  例如,可以聲明一個泛型類 MyGenericClass,這樣,類型參數 T 就可以實現 IComparable<T> 接口:

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

2、基類約束:

  指出某個類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數。

這樣的約束一經使用,就必須出現在該類型參數的所有其他約束之前。

  class MyClassy<T, U>
    where T : class
    where  U : struct
  { }

3、where 子句還可以包括構造函數約束:

  可以使用 new 運算符創建類型參數的實例;但類型參數為此必須受構造函數約束 new() 的約束。

new() 約束可以讓編譯器知道:提供的任何類型參數都必須具有可訪問的無參數(或默認)構造函數。例如:

  public class MyGenericClass<T> where T : IComparable, new()
  {
    // 如果沒有new()約束,以下代碼行是不可能的
    T item = new T();
  }

new() 約束出現在 where 子句的最后。

4、對於多個類型參數,每個類型參數都使用一個 where 子句:

  interface MyI { }
  class Dictionary<TKey, TVal>
    where TKey : IComparable, IEnumerable
    where TVal : MyI
  {
    public void Add(TKey key, TVal val)
    {
    }
  }

5、還可以將約束附加到泛型方法的類型參數,例如:

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

  注:對於委托和方法兩者來說,描述類型參數約束的語法是一樣的:

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


免責聲明!

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



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