一般限制:區分值與引用
在 C# 中,一般限制可用於強制型別參數的特定要求。這在區分值類型、可為空值類型和參考類型時特別有用。
值和可為空值類型的限制
考慮以下程式碼,它區分普通值型別與可為空值之間types:
static void Foo<T>(T a) where T : struct { } // Plain value type (e.g. int) static void Foo<T>(T? a) where T : struct { } // Nullable value type (e.g. int?)
引用類型的限制
但是,嘗試使用where T : class 定義參考類型的約束會導致編譯器錯誤。這是因為在重載解析期間會強制執行約束,且參數優先於約束。
要解決此問題,可以將約束放置在參數內,儘管方式不太優雅:
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 { } // Plain value type static void Foo<T>(T? a) where T : struct { } // Nullable value type static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // Reference type
透過將約束放置在可選參數ignore中,編譯器可以區分不同的情況,而不會與參數類型發生衝突。這允許將引用類型按預期映射到正確的函數重載。
以上是C# 泛型限制如何區分值型別、可空值型別和參考型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!