Operator-Overloading



  • Hey Freunde der Sonne,

    seit wann gibt es in .NET "Operator-Overloading" ??

    Als ich den Type "Double" in der MSDN angschaut habe, sah ich dass da die operatoren überladen wurden.. dann hab ich es in einer meiner klasse impkementiert

    class Test
    	{
    		public static bool operator ==(Test left, Test right)
    		{
    			return right.Equals(left);
    		}
    		public static bool operator !=(Test left, Test right)
    		{
    			return !right.Equals(left);
    		}
    	}
    

    und es scheint zu gehen.. aber ich erinnere mich dass es im .NET 3.5 nich ging? oder lag ich falsch?:)

    grüßle



  • Hallo

    Doch das geht schon relativ lange es weis nur fast keiner. Nach Doku von Microsoft schon mit 2.0, siehe hier: https://msdn.microsoft.com/de-de/library/aa288467(v=vs.71).aspx

    Mfg Marco



  • NullBockException schrieb:

    seit wann gibt es in .NET "Operator-Overloading" ??

    Naja, in .NET gibt es das in dem Sinne eigentlich nicht, als dass man damit nicht CLS-compliant ist, d.h. es müssen nicht alle Sprachen operator overloading unterstützen und es tun auch nicht alle.

    C# als eine der Sprachen, die es unterstützen, hat es seit Release 1.0 immer schon gehabt.



  • Coole sache;) 👍 👍



  • @NullBockException
    Anm.: Deine Implementierung geht nicht korrekt mit null Werten um.

    @copperator
    .NET ist für mich die Plattform, also das Framework, die Spezifikation der IL und VM usw. Und da ist AFAIK ein standardisierter Mechanismus definiert wie man Operator Overloading zu machen hat.

    Dass den nicht alle CLS compliant Sprachen unterstützen müssen ist wieder 'was anderes.

    Nach deiner Argumentation müsste man sonst auch sagen ".NET kann keine unsigned Typen". Was irgendwie Blödsinn ist. .NET "kann" natürlich unsigned Typen, es verlange bloss nicht von jeder Sprache sie zu unterstützen.



  • @Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?





  • NullBockException schrieb:

    @Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?

    Die Frage ist jetzt nicht ernst gemeint, oder?



  • hustbaer schrieb:

    NullBockException schrieb:

    @Hustbaer: Danke für die Anmerkung, war ja um rumzuspielen;) Aber wie wäre denn das korrekte verhalten, wenn eines der Ojekte null wäre?

    Die Frage ist jetzt nicht ernst gemeint, oder?

    Ich schätze mal es war ernst gemeint. 🙄

    @NullBockException:

    Ist die Instanz auf der du Equals aufrufst null, wird dir eine NullReferenceException um die Ohren gehauen. - Das sollte dir helfen um herauszufinden, wie die Methode richtig aussehen müsste.



  • `null == null -> true

    nonnull == null -> false

    null == nonnull -> false

    nonnull == nonnull -> Objekte Vergleichen`

    Das wäre das übliche Verhalten.
    Ansonsten programmiert man es halt so wie man es haben will, obwohl vermutlich kaum etwas anderes Sinn machen wird.
    Was auf jeden Fall unerwartet wäre: wenn bei a == b eine Exception fliegt wenn a oder b (oder beide) null sind.



  • 🙂 😃 😉

    Ja das nächste mal denk ich etwas nach;)

    Aber Ihr hört euch doch auch gern reden oder nich :p :p



  • hustbaer schrieb:

    `null == null -> true

    nonnull == null -> false

    null == nonnull -> false

    nonnull == nonnull -> Objekte Vergleichen`

    Wobei das garnicht so einfach ist, wie ich gerade im Test heraus bekommen habe.

    Folgendes hatte ich probiert:

    class Test
    {
        public static bool operator ==(Test left, Test right)
        {
            if((left == null && right != null) 
               || (left != null && right == null))
                   return false;
            else
               return left.Equals(right);
        }
    
        // ...
    }
    

    Welches Problem tritt auf?
    Es kommt zu einer StackOverFlow-Exception, da ja der neue Operator für den Vergleich left == null aufgerufen wird. Den rest kannst dir sicher denken. - Mir fällt aber auch gerade kein Effizienter weg ein, das zu umgehen.

    // Edit:
    Ah wait, found a way:

    [code="cs"]
    class Test
    {
        public static bool operator ==(Test left, Test right)
        {
            if(((object)left == null && (object)right != null) 
               || ((object)left != null && (object)right == null))
                   return false;
            else
               return left.Equals(right);
        }
    
        // ...
    }
    

    [/code]



  • Es gibt auch noch Object.ReferenceEquals

    ps:

    public static bool operator ==(Test left, Test right) 
        { 
            if (object.ReferenceEquals(left, null))
                return object.ReferenceEquals(right, null);
            else 
                return left.Equals(right); // Equals must do a null-check for right anyway, so we don't have to repeat it here
        }
    

Anmelden zum Antworten