2009-04-30 9 views
49

Ich habe die folgende Methode mit generischem Typ:Wie definiert man generische Typlimits für primitive Typen?

T GetValue<T>(); 

Ich mag würde T auf primitive Typen wie int, string, float aber nicht Klassentyp begrenzen. Ich weiß, ich kann für Klassentyp wie diese allgemeine Definition:

C GetObject<C>() where C: class; 

Ich bin nicht sicher, ob es für primitive Typen möglich ist und wie wenn ja.

Antwort

42

Sie können diese verwenden, um Werttypen zu begrenzen:

where C: struct 

Sie auch String erwähnen. Strings sind leider nicht erlaubt, da sie keine Werttypen sind.

+0

aber nicht, die NULL-Werte zulässt –

+1

für String ValueType definiert und es können Sie natürlich passieren Strukturtyp jede benutzerdefinierte, nicht nur primitive Typen. Ich bin mir nicht sicher, ob es wirklich einen Weg gibt, abgesehen von der Definition von Überladungen für alle eingebauten primitiven Typen. –

13

Hier ist, was Sie suchen:

T GetObject<T>() where T : struct; 
+0

Dang es! Ich hasse es, wenn mich jemand schlägt. Nizza BFree! –

+0

Wie wäre es mit einem String, der primitiv, aber nullbar ist? –

+2

@David: String ist kein primitiver Typ. Es ist ein Referenztyp, der in einigen Fällen als primitiver Typ behandelt wird. – Samuel

5

Was sind Sie eigentlich in dem Verfahren zu tun versuchen? Es könnte sein, dass Sie C benötigen, um IComparable oder eine andere Schnittstelle zu implementieren. In diesem Fall möchten Sie etwas wie

T GetObject<T> where T: IComparable 
9

Es gibt keine generische Einschränkung, die dieser Reihe von Dingen sauber entspricht. Was willst du eigentlich machen? Zum Beispiel können Sie herum mit Laufzeitprüfungen hacken, wie einem statischen ctor (für generische Typen - nicht so einfach für generische Methoden) ...

Allerdings; die meiste Zeit ich das sehen, ist es, weil die Menschen eine der wollen:

  • der Lage sein, Artikel auf Gleichheit zu überprüfen: in diesem Fall verwenden EqualityComparer<T>.Default
  • der Lage sein,/Art Gegenstände zum Vergleich: in diesem Fall Anwendung Comparer<T>.Default
  • der Lage sein, Arithmetik auszuführen: Sie in diesem Fall MiscUtil ‚s Unterstützung für generic operators
15

Eigentlich ist dies die Aufgabe zu gewissen Grad:

public T Object<T>() where T : 
    struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> 

auf numerische Typen begrenzen Sie für die Klasse einige nützliche Hinweise der folgenden Proben erhalten können

Verwandte Themen