Nachdem ich selbst auf dieses Problem gestoßen bin und versucht habe, ein generisches Vector2<int/float/double>
in C # zu implementieren, habe ich eine Reihe von Untersuchungen zu diesem Problem durchgeführt, die auch in dieser Frage beschrieben sind:
Weniger generische Generika? Eine mögliche Lösung für die Arithmetik in C # Generika
Diese Links enthalten weitere Hintergrundinformationen und faszinierende Lösungsansätze:
Nun, da C # 4.0 mit seinem neuen vielseitigen dynamic
-Typ herauskommt, ist meine Frage für die brillante SO-Community: Ist es ein Tool, das vielleicht verwendet werden könnte, um leistungsfähige, generische Vektor / Matrix / etc. numerische Typen?
Es ist klar, dass ein Vektor2 einfach wie folgt aufgebaut werden kann:
%Vor% Aber mit diesem Ansatz haben wir hier keine Typenzwangsbeschränkung, also könntest du Vector2(3, 12.4572)
machen. Gibt es eine Möglichkeit, dynamische Elemente mit einem Typparameter Vector2<int>
zu mischen, um unsere mathematischen Operationen auszuführen, wie dies mit int
s geschehen würde?
Vielleicht könnte eine Art Casting verwendet werden, um sicherzustellen, dass this.X
ein T
ist, obwohl ich nicht weiß, wie das funktionieren würde.
Nur Sie können feststellen, ob dynamische Operatoraufrufe Ihre Leistungsanforderungen erfüllen, aber es ist sicherlich möglich, einige Ihrer Typsicherheitsaspekte mit Generika zu behandeln - es gibt keinen Grund, dass alles überprüft werden muss Laufzeit nur wegen eines kleinen dynamischen Aufrufs:
%Vor% Die einzige gefährliche Operation besteht nun darin, zwei Vektoren des gleichen Typs hinzuzufügen (der Additionsoperator muss wie erwartet mit dem Argument "type" arbeiten), aber alles andere ist vollkommen typsicher , so wie es sein sollte. Sie können new Vector<int>("a", 5)
nicht ausführen, einen Vector<int>
und einen Vector<string>
hinzufügen oder den Zusatz von zwei Vector<int>
s einem Vector<string>
zuweisen. Beachten Sie, dass keiner dieser Fehler bei der Kompilierung mit Ihrer ursprünglichen Lösung abgefangen wurde.
Beachten Sie Folgendes:
Es gibt nichts, was Sie davon abhalten könnte, generics hier zu verwenden, aber geht die kompilierende-eine-Ausdruck-Baumroute für die Addition anstatt dynamic
durch. Delegataufrufe sind nicht frei, aber sie sollten theoretisch in diesem Fall schneller sein als der dynamic
-Ansatz - zumindest vermeiden Sie das Boxen von Werttypen. Nur Sie können feststellen, ob sie schnell genug sind .
Ziehen Sie in jedem Fall in Erwägung, einen statischen Konstruktor zu schreiben, der validiert, dass das Typ-Argument tatsächlich einen geeigneten Additionsoperator hat, so dass Typfehler früh im Spiel auftreten.
BEARBEITEN (OP ist nicht zufrieden mit der Leistung von dynamic
hier):
Der Ausdruck-Baum-Ansatz würde etwa so aussehen:
%Vor%Tags und Links generics dynamic c#-4.0 type-constraints