generische Typen und Operatoren

  • C#
  • .NET 5–6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MasterQ.

    generische Typen und Operatoren

    Hallo,

    ich möchte eine generische Klasse erstellen und dazu auch Operatoren definieren. Hier mal ein nichtfunktionales Beispiel:

    C#-Quellcode

    1. class Generisch<T> where T : struct {
    2. public static Generisch<T> operator +( T[] a, T b) {
    3. var c = a[4] + b;
    4. }


    Der Compiler schmeißt in Zeile 3 nun einen Fehler CS0019, Der +-Operator kann nicht auf Operanden vom T und T angewendet werden. öhm??

    Jetzt habe ich ein Henne-Ei Problem, oder? Wie wäre das dann zu regeln mit dem +-Operator ??

    Gruß

    MQ
    @MasterQ Dann solltest Du zunächst Deiner Klasse einen überladenen +-Operator geben:

    C#-Quellcode

    1. public static T operator +(T v1, T v2)
    2. {
    3. return // was auch immer
    4. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    MasterQ schrieb:

    Der +-Operator kann nicht auf Operanden vom T und T angewendet werden.

    Ja, in Zeile 3 stimmt das ja auch.
    Also du willst zwar einen Operator + für T implementieren, aber innerhalb dessen kannste ihn ja noch nicht benutzen.

    Oder anders: Der Compiler hat keine Ahnung, welchen Datentyp a, b haben. Er weiss nur: sie haben denselben Datentyp, und sie sind Structures.
    Da T generisch ist kanns jede Structure sein.
    Aber nicht alle Structures kann man addieren.
    Zum Beispiel DateTime ist eine Struct - was soll dabei herauskommen:
    #2001-09-11# + #2022-01-26#
    ?
    etwa #4023-10-37#?
    Das ist, was er dir sagt: "kann nicht angewendet werden".
    Das ist mir schon klar.

    Wenn man generische Typen verwenden will und dazu Operatoren definieren will, muss man sich von den komplexesten zu den einfachen Datentypen runterhangeln. Irgendwann landet man bei den grundlegen Datentypen wie int oder double oder was auch immer.

    Ich dachte, dass die Prüfung, ob es einen passenden +-Operator gibt, dann durchgeführt wird, wenn T konkret benannt ist, also bei Generisch<double>. Für double gibt es ja einen +-Operator.

    Wenn das Konstrukt T operator +(T a, T b) nicht geht weil der Compiler nicht entscheiden kann, ob er einen +-Operator für T schon kennt, dann funktioniert das Ganze System irgendwie nicht. Ich müsste jetzt folgendes definieren

    T operator +(double a, double b)
    ​T operator +(double a, int b)
    ...

    und alle sonstigen möglichen Permutationen. Wenn ich das machen muss, dann brauche ich keine generische Klasse mehr. Dann muss ich doch für alle möglichen Datentypen eine eigene Routine schreiben.

    Das kann es nicht sein, macht keinen Sinn! Oder?
    Ich habe noch etwas weiter im Netz gestöbert.

    Leider scheint es prinzipiell gar nic ht möglich, generische +-Operatoren (oder ähnliche) in C# zu definieren. Der ganze Ansatz ist somit zum Scheitern verurteilt.

    Find ich grad nicht lustig, da es mein Konzept vöillg über den Haufen schmeißt.

    Danke trotzdem

    MQ