處理泛型類型時,通常需要區分值類型、可空值類型和引用類型。考慮以下程式碼:
static void Foo<T>(T a) where T : struct { } // 1 static void Foo<T>(T? a) where T : struct { } // 2
此程式碼成功處理值類型 (1) 和可為 null 的值類型 (2)。但是,嘗試使用以下約束檢測引用類型 (3) 不會編譯:
static void Foo<T>(T a) where T : class { } // 3
錯誤訊息表示具有相同簽章的成員已存在。出現此問題的原因是約束不是簽名的一部分,但參數是。為了解決這個問題,我們可以將約束放在一個參數中:
class RequireStruct<T> where T : struct { } class RequireClass<T> where T : class { } static void Foo<T>(T a, RequireStruct<T> ignore = null) where T : struct { } // 1 static void Foo<T>(T? a) where T : struct { } // 2 static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // 3
這種方法允許我們區分這三種情況。
以上是我們如何區分 C# 泛型約束中的值型別、可空值型別和參考型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!