Ich habe eine Struktur, die wie folgt aussieht:C# Operator Overloading Generisches der Subclass Mit
public struct Vector2d<T> where T : Unit {
public double x;
public double y;
...
public static Vector2d<Length> operator * (Vector2d<Speed> speed, Vector2d<Duration> duration) {
return new Vector2d<Length>(speed.x * duration.x, speed.y * duration.y);
}
}
die Länge, Geschwindigkeit und Dauer-Typen sind alle Subtypen der Einheit. (T von Einheit erbt auch)
jedoch der Compiler sagt:
One of the parameters of a binary operator must be the containing type.
Das erscheint mir seltsam, weil die zur Verfügung gestellten Typen Unterklassen des enthaltenden Typs sind.
Warum ist das, was ich versuche, illegal zu machen?
Ich weiß Vector2 ist keine Unterklasse von Vector2, aber ich versuche nicht, die Werte des generischen Typs zu verwenden. Alle im Operator verwendeten Daten sind die Vector2-Klasse.
Es ist illegal, weil die Sprachdesigner es illegal gemacht haben. Die Fehlermeldung informiert Sie genau über die Einschränkung, die die C# -Spezifikation beschreibt. Der Compiler folgt nur der Spezifikation. Wenn Sie wissen wollen "warum?" Sie müssen die Sprachdesigner fragen, und selbst dann kann ihre Argumentation in erster Linie auf ihrer eigenen Meinung beruhen. –
Nicht sicher, warum diese Frage abgelehnt wurde ... perfekt gültige Frage mit Code und klarer Frage. +1 von mir. – CodingYoshi
Ich empfehle den Versuch, Unit-Analyse über Generika darzustellen. Einheiten sind die Art von Dingen, die wirklich in die Sprache eingebaut werden müssen. Siehe zum Beispiel F # 's Einheitentyp Anmerkungen. https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/units-of-measure –