簡體   English   中英

如何指定 .NET Generics 約束中不允許的類型?

[英]How to specify types not allowed in a .NET Generics constraint?

是否可以在不允許某些類型的通用 class 上指定約束? 我不知道這是否可能,如果可能,我不確定語法是什么。 就像是:

public class Blah<T> where : !string {
}

我似乎找不到任何允許這種約束的符號。

您可以獲得的最接近的是運行時約束。

編輯:最初我將運行時檢查放在構造函數調用中。 這實際上並不是最優的,因為它會在每次實例化時產生開銷; 我相信將檢查放在static構造函數中會更明智,該構造函數將被用作Blah<T>類型的T參數的每種類型調用一次:

public class Blah<T> {
    static Blah() {
        // This code will only run ONCE per T, rather than every time
        // you call new Blah<T>() even for valid non-string type Ts
        if (typeof(T) == typeof(string)) {
            throw new NotSupportedException("The 'string' type argument is not supported.");
        }
    }
}

顯然不理想,但如果你把這個約束放在適當的位置記錄string不是受支持的類型參數的事實(例如,通過 XML 注釋),你應該得到接近編譯時約束的有效性的地方。

不,您不能直接指定“否定”類型約束。

約束只能是正約束,如文檔中所述。

您唯一能做的就是指定哪些類型可以放入泛型類型中,但您不能指定哪些類型不能放入其中。

這是允許的約束(更多細節

  • 其中 T:結構
  • 其中 T:class
  • 其中 T:新()
  • 其中 T:[基本 class 名稱]
  • 其中 T:[接口名稱]
  • 其中 T:U(為 T 提供的類型參數必須是或派生自為 U 提供的參數)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM