dieses == null // Wie kann es möglich sein?

Vor kurzem bin ich auf ein merkwürdiges Verhalten meiner Anwendung gestoßen. Es wurde hauptsächlich in C # entwickelt, aber CLI / C ++ wurde auch verwendet, um eine bessere Leistung zu erzielen. Ich habe eine System.NullReferenceException in einer sehr einfachen Methode beim TimeSpan-Vergleich erhalten:

TimeSpan _timestamp;
void UpdateFrame(TimeSpan timestamp)
{
    if(TimeSpan::Equals(_timestamp, timestamp) == false) 

s war offensichtlich, dass die einzige in diesem Ausdruck verwendete Referenz implizit dies war (this._timestamp). Ich habe eine assert-Anweisung hinzugefügt, und es stellte sich heraus, dass dies tatsächlich null ist. Nach kurzer Recherche gelang es mir, ein kurzes Programm zu erstellen, in dem dieses Phänomen vorgestellt wurde. Es ist C ++ / CLI.

using namespace System;
using namespace System::Reflection;

public class Unmanaged
{
public:
    int value;
};

public ref class Managed
{
public:
    int value;

    Unmanaged* GetUnmanaged()
    {
        SampleMethod();
        return new Unmanaged();
    }

    void SampleMethod()
    {
        System::Diagnostics::Debug::Assert(this != nullptr);
        this->value = 0;
    }
};

public ref class ManagedAccessor
{
public:
    property Managed^ m;
};

int main(array<System::String ^> ^args)
{
    ManagedAccessor^ ma = gcnew ManagedAccessor();
    // Confirm that ma->m == null
    System::Diagnostics::Debug::Assert(ma->m == nullptr);
    // Invoke method on the null reference
    delete ma->m->GetUnmanaged();
    return 0;
}

Weiß jemand, wie es möglich sein kann? Ist es ein Fehler im Compiler?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage