Generische Einschränkungen: Unterscheidung zwischen Wert- und Referenztypen
Einführung
In der generischen Programmierung Mit Einschränkungen können wir Einschränkungen für Typparameter festlegen. Ein häufiges Problem ist die Unterscheidung zwischen Werttypen (z. B. Ganzzahlen) und Referenztypen (z. B. Zeichenfolgen). Diese Frage untersucht einen Fall, in dem Einschränkungen für Typparameter nicht wie erwartet aufgelöst wurden.
Das Problem
Der Autor stellte die Herausforderung, zwischen verschiedenen Werttypszenarien zu unterscheiden: einfach Werttypen (int), Nullable-Werttypen (int?) und Referenztypen (string). Ursprünglich schlugen sie vor, where T : struct zur Identifizierung von Strukturtypen (Werttypen) und where T : class zur Identifizierung von Referenztypen zu verwenden, was jedoch aufgrund doppelter Elementdefinitionen zu einem Kompilierungsfehler führte.
Die Lösung
Die wichtigste Erkenntnis ist, dass Einschränkungen nicht Teil der Methodensignatur sind und die Überlastungsauflösung Parametertypen berücksichtigt. Daher hat der Autor die Einschränkung in einen Parameter eingefügt, um zwischen Wert- und Referenztypen zu unterscheiden. Hier ist der überarbeitete Code:
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
Durch die Verwendung dieser Hilfsklassen unterscheidet der Code jetzt korrekt zwischen den verschiedenen Werttypszenarien. Foo(z) wird kompiliert und der Methode (3) zugeordnet, da string ein Referenztyp ist.
Das obige ist der detaillierte Inhalt vonWie können generische Einschränkungen effektiv zwischen Wert- und Referenztypen in C# unterscheiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!