struct == null



  • Hallo zusammen,

    kann mir jemand erklären warum das folgende kompiliert?

    private struct MyStruct
    {
    	public static bool operator ==(MyStruct a, MyStruct b)
    	{
    		return true;
    	}
    
    	public static bool operator !=(MyStruct a, MyStruct b)
    	{
    		return !(a == b);
    	}
    }
    
    //Im Code dann:
    	MyStruct test = new MyStruct();
    	if (test == null)
    	{
    
    	}
    

    Lasse ich die Implementierung vom operator == weg, dann bekomme ich wie erwartet einen Compile-Fehler, so kompiliert es, aber der Resharper zeigt mir direkt an, dass die Expression immer false ist.

    mfG
    KaPtainCugel



  • Nullable Type conversion fucked hier rein.

    Ein struct wird in vielen Situationen zu einem Nullable Type konvertiert. Jeder Operator für Foo gilt auch für Foo? und hier findet lustige Konvertierung statt.

    Prinzipiell ist es also nur eine lustige nebenerscheinung von Nullable Types.



  • Alles klar danke, auch wenn es mir immer noch seltsam vorkommt was da im Hintergrund passiert.



  • KPC schrieb:

    Alles klar danke, auch wenn es mir immer noch seltsam vorkommt was da im Hintergrund passiert.

    Naja, das Problem ist folgendes:

    Du definierst einen operator== für MyStruct==MyStruct.
    Nun hast du aber statt einem MyStruct Objekt ein MyStruct? Objekt - also nullable.

    Da muss der operator== ja auch funktionieren. Sonst wäre es ja richtig ärgerlich Nullable Types zu verwenden, wenn alle Operatoren neu geschrieben werden müssen... Was C# also intern macht ist, statt einem MyStruct==MyStruct Operator, wird ein MyStruct?==MyStruct? operator definiert und bei jedem Aufruf wird einfach nach MyStruct? gecastet. (die Beschreibung ist uU technisch nicht vollkommen korrekt - es läuft aber im Endeffekt auf diesen Cast hinaus)

    Das führt dazu, dass null natürlich ein erlaubter wert ist, da
    (MyStruct?)null
    ja vollkommen in Ordnung ist.

    Gleichzeitig weiß der Compiler aber auch, dass ein Vergleich von einem MyStruct mit null immer false sein wird. Oder zumindest der Linter weiß es, bzw. kann es ableiten.

    Nullable Types sind etwas sehr cooles - haben aber einige komische Konsequenzen mitsich gezogen - wie eben Operator Überladung bei Value Typen.



  • Besten Dank, das macht es klarer!


Anmelden zum Antworten