Ich habe die folgende Methode mit generischem Typ:
T GetValue<T>();
Ich möchte T auf primitive Typen wie int, string, float, aber nicht auf Klassentypen beschränken. Ich weiß, dass ich generisch für einen Klassentyp wie diesen definieren kann:
C GetObject<C>() where C: class;
Ich bin mir nicht sicher, ob und wie primitive Typen möglich sind.
c#
.net
generics
type-constraints
David.Chu.ca
quelle
quelle
int
,float
usw. nichtInt32
,Int64
,Single
etc .. Obwohlclass
bezeichnet einen ref Typ „ aber nicht Klassentyp“ ist darauf hindeutet , den Unterschied zwischen unmanaged und managed Primitiven.Antworten:
Sie können dies verwenden, um es auf Werttypen zu beschränken:
where C: struct
Sie erwähnen auch Zeichenfolge. Zeichenfolgen sind leider nicht zulässig, da es sich nicht um Werttypen handelt.
quelle
n1 + n2
bei der n1 und n2 beide vom Typ sindC
, wird mir der FehlerOperator '+' cannot be applied to operands of type 'C' and 'C'
Eigentlich macht das den Job bis zu einem gewissen Grad:
public T Object<T>() where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
Um sich auf numerische Typen zu beschränken, erhalten Sie einige nützliche Hinweise zu den folgenden Beispielen, die für die ValueType- Klasse definiert wurden
quelle
Folgendes suchen Sie:
T GetObject<T>() where T : struct;
quelle
struct
Anforderung zu erfüllen , oder?Es gibt keine generische Einschränkung, die genau mit diesen Dingen übereinstimmt. Was möchten Sie eigentlich tun? Zum Beispiel können Sie es mit Laufzeitprüfungen wie einem statischen ctor umgehen (für generische Typen - für generische Methoden nicht so einfach) ...
Jedoch; Meistens sehe ich das, weil die Leute eines von folgenden wollen:
EqualityComparer<T>.Default
Comparer<T>.Default
quelle
Was versuchst du eigentlich in der Methode zu tun? Es kann sein, dass Sie tatsächlich C benötigen, um IComparable oder eine andere Schnittstelle zu implementieren. In diesem Fall möchten Sie so etwas wie
T GetObject<T> where T: IComparable
quelle