Leider ist es sehr schwer, den Compiler von bestimmten T-Implementierungen zu überzeugen. Ein (unangenehmer) Ansatz besteht darin, in der Mitte in ein Objekt zu casten (beachten Sie, dass dadurch Wertetypen ge- und entpackt werden):
int i = (int)(object)this.value;
i++;
this.value = (T)(object)i;
Hässlich, aber es funktioniert. In .NET 3.5 habe ich einige bessere Wrapper für generische Arithmetik, aquí . Die Klasse Operator ist Teil von MiscUtil Ich vermute, dass AddAlternative auf der einfachsten Ebene sehr gut funktionieren würde:
this.value = Operator.AddAlternative(this.value, 1);
Dies sollte die impliziten <T,int> automatisch herleiten, oder Sie können sie selbst hinzufügen:
this.value = Operator.AddAlternative<T,int>(this.value, 1);
Nutzen Sie : Dies ist dem ursprünglichen Code vorzuziehen, da er sich nicht um das ursprüngliche T kümmert - er funktioniert für jeden Typ (auch Ihren eigenen), der "T +(T,int)" unterstützt.
Ich glaube, irgendwo da drin ist auch ein ChangeType versteckt...
[Collin K und andere machen eine gültige Bemerkung über die architektonischen Implikationen - aber da ich pragmatisch bin, gibt es Zeiten, in denen das T wirklich so wichtig ist... aber ich würde zustimmen, diese Art von Spezialisierung zu vermeiden, es sei denn, es gibt einen anderen Weg. vraiment notwendig. Abgesehen davon (wie in meinem Kommentar zu Collins Beitrag) ist die Fähigkeit, Dinge wie grundlegende Arithmetik (Inkrement, Int32-Division usw.) auf (zum Beispiel) einer Matrix<T> [für T in dezimal/float/int/double/etc] durchzuführen, oft sehr wertvoll.