Ich habe gerade versucht, die folgende Ausnahme zu debuggen:
%Vor%Dies ist der betreffende Code:
%Vor% computer.IpAddress
wird auf 1582281193
gesetzt. Dies wird in hostToNetworkOrder
konvertiert, was -374255778
ist.
Wenn ich jetzt versuche, new IPAddress( -374255778 );
im Direktfenster in Visual Studio zu erstellen, erhalte ich ein IPAddress-Objekt, das die korrekte IP-Adresse enthält.
Aber wenn ich über die Zeile im Code steige, wird immer eine ArgumentOutOfRangeException auslösen. Warum?
Ich war mir bewusst, dass meine Eingabe, die negativ war, wahrscheinlich die Quelle dieses Problems war. So habe ich es gelöst:
%Vor%Was ich immer noch nicht verstehe ist, warum es überhaupt im Direktfenster funktioniert hat.
Betrachtet man die IPAddress-Klasse in ILSpy, so gibt es einen internen Konstruktor, der einen int-Wert annimmt und kein Argument außerhalb der Bereichsüberprüfung ausführt. Ich habe das Gefühl, dass er den Konstruktor im Überwachungsfenster aufruft, aber im eigentlichen Code es ruft den öffentlichen ctor (long) auf, der diese Nummer validiert.
Um meine Theorie zu testen, habe ich gerade dieses Stück Code ausprobiert:
%Vor%und, tatsächlich, die IPAddress-Klasse wird ohne Fehler erstellt.
Was ich immer noch nicht verstehe ist, warum es überhaupt im Direktfenster funktioniert hat.
Dies ist der Kern Ihrer Frage. Worauf Sie nicht zählen, ist ein etwas merkwürdiges Verhalten des Debugger-Ausdrucksauswerters, der zum Analysieren Ihres Ausdrucks im Direktfenster verwendet wird. Dies wird am besten mit einer Beispiellösung mit Code veranschaulicht, der sich wie IPAddress verhält. Erstellen Sie ein Projekt im Konsolenmodus und fügen Sie ein Klassenbibliotheksprojekt hinzu. Stellen Sie die Quelltextdatei der Klassenbibliothek wie folgt dar:
%Vor%Und die Datei Program.cs der Konsolen-App wie folgt:
%Vor%Drücken Sie F5 und wechseln Sie zum Direktfenster, wenn der Haltepunkt erreicht wird. Geben Sie Folgendes ein:
%Vor%Und Sie werden sehen:
%Vor%Es hat den internen -Konstruktor über den öffentlichen
ausgewähltGleiches passiert mit IPAddress, es hat einen internen Konstruktor, der einen int akzeptiert, der das Argument nicht überprüft. Während dies laut wie ein Bug quatscht, bietet das Bereitstellen von Zugriff auf private und interne Mitglieder normales Debugger-Verhalten. Beachten Sie im Allgemeinen immer, dass der Debugger-Ausdruck-Evaluator nicht vom C # -Compiler gesteuert wird. Es verwendet nicht die gleichen Regeln wie die Sprache und hat nicht die volle Aussagekraft als Sprache. Hoffentlich wird sich das etwas verbessern, nachdem Roslyn das Projekt abgeschlossen hat.
Sie erhalten System.ArgumentOutOfRangeException
, wenn die IP-Adresse unter 0 oder über 0x00000000FFFFFFFF liegt, wie hier .
Der IPAddress-Konstruktor akzeptiert einen Parameter vom Typ long (eine 64-Bit-Ganzzahl), übergibt ihm jedoch eine 32-Bit-Ganzzahl, die in eine lange umgewandelt wird.
Tags und Links c#