Warum wirft IPAddress manchmal eine ArgumentOutOfRangeException?

9

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?

Aktualisieren

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.

    
Oliver Salzburg 10.04.2012, 11:32
quelle

4 Antworten

8

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.

    
kmp 10.04.2012, 12:03
quelle
3
  

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ählt

Gleiches 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.

    
Hans Passant 10.04.2012 12:39
quelle
1

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.

    
Jesse van Assen 10.04.2012 11:47
quelle
0

Ich hatte das gleiche Problem, ich habe die IP in int32 konvertiert:

%Vor%

Für einige IP-Adressen wurde eine negative Zahl verwendet. Die einzige Änderung, die ich gemacht habe, war Int64 und es löste mein Problem.

%Vor%     
Abdallah 21.04.2015 06:37
quelle

Tags und Links