Bitte zögern Sie nicht, mehr Klarheit zu bieten, wenn meine Antwort off-kilter scheint.
Es gibt keine generischen Einschränkungen für Operatoren in der Sprache C#. Wie Jon Skeet mit Unconstrained Melody bewiesen hat, könnten die Constraints in der CLR selbst durchaus perfekt sein.
Das Beste, was Sie mit Constraints tun können, ist die Bereitstellung von Schnittstellen/benutzerdefinierten Klassen, die die von Ihnen benötigten Aktionen aufzeigen. Sie könnten das primitive Element nicht bereitstellen (es sei denn, Sie implementieren auch den Operator implicit
), aber Sie können zumindest generischen Code für den mathematischen Teil erstellen.
Generische Constraints erlauben dem Compiler, die verfügbaren Member basierend auf dem kleinsten gemeinsamen Nenner (wie durch die Einschränkung oder das Fehlen von angegeben) zu folgern. In den meisten Fällen sind Generika nicht eingeschränkt und geben Ihnen nur die Semantik object
.
Alternativ, vermeiden Einschränkungen und verwenden
dynamic
vorübergehend die generische Variable zu speichern und dann die Annahme, (über Duck Typing), dass sie die betreffenden Betreiber hat:
class Program
{
static void Main(string[] args)
{
var result = Add<int, long, float>(1, 2);
Console.WriteLine(result); // 3
Console.WriteLine(result.GetType().FullName); // System.Single
Console.Read();
}
static T3 Add<T1, T2, T3>(T1 left, T2 right)
{
dynamic d1 = left;
dynamic d2 = right;
return (T3)(d1 + d2);
}
}
Das das DLR beinhaltet und muss etwas Performance-Overhead (ich habe keine genauen Zahlen), insbesondere wenn Sie die Berechnungen als performancekritisch betrachten.
Ich bin mir nicht sicher, was Sie „mehrere Male die gleichen generischen Typ deklarieren“ bedeuten, das funktioniert:
class Tuple<T1, T2> // etc.
var myTuple = new Tuple<int, int>(1, 2);
Leider ist die Typeinschränkung nicht zulassen, dass Sie verlangen, dass der Typ arithmetische Operatoren unterstützt. Was ich interessant finde, ist, dass im BCL-Quellcode für z.B. 'Int32' finden Sie eine' IArithmetic' Schnittstelle in der Vererbungsliste, die auskommentiert ist. Dies ist reine Spekulation meinerseits, aber wenn Microsoft diese Schnittstelle in der BCL aktiviert, dann könnten Sie vielleicht 'IArithmetic 'als eine Einschränkung angeben, um Ihnen zu erlauben, Ihre eigenen generischen Klassen mit Arithmetik zu schreiben. –
Link zu ähnlicher Frage: http://stackoverflow.com/q/4039694/613130 – xanatos