Frage

Betrachten Sie die folgenden Aussagen:

int? v1 = null;

int? v2 = 5 * v1;

Was ist der Wert von v2? (null oder leere Zeichenfolge?)

Wie kann ich den Compiler verhindern, ihn als ungültige Operation zu markieren? Muss ich benutzerdefinierte Ausnahmebehandlung folgen?

War es hilfreich?

Lösung

Es ist null.

C# Sprachspezifikation 3.0 (Abschnitt §7.2.7: Aufgehobene Operatoren)

Für die binären Betreiber + - * / % & | ^ << >> :

Es gibt eine aufgehobene Form eines Bedieners, wenn der Operand und die Ergebnistypen alle nicht nutzbaren Werttypen sind. Die angehobene Form wird durch Hinzufügen eines einzelnen konstruiert ? Modifikator zu jedem Operanden und Ergebnistyp. Der aufgehobene Bediener produziert a null Wert, wenn einer oder beide Operanden sind null (Eine Ausnahme ist die & und | Betreiber der bool? Typ, wie in §7.10.3 beschrieben). Andernfalls packt der angehobene Bediener die Operanden aus, wendet den zugrunde liegenden Bediener an und wickelt das Ergebnis.


Wie kann ich den Compiler verhindern, ihn als ungültige Operation zu markieren? Muss ich benutzerdefinierte Ausnahmebehandlung folgen?

Es ist keine ungültige Operation. Es wird keine Ausnahme ausgelöst, sodass Sie in diesem Fall keine Ausnahmen bewältigen müssen.

Andere Tipps

Wenn Sie möchten, dass der Vorgang vom Compiler verhindert wird, machen Sie die zweite Variable nicht nullbar. Dann werden Sie gezwungen sein zu schreiben:

int v2 = 5 * v1.Value;

Dies macht eine Ausnahme zur Laufzeit, wenn V1 null ist.

Sein Wert wird "null" sein, in diesem Zusammenhang kann zumindest als Datenbank -NULL, dh eher als nichts oder Null, "unbekannt" angesehen werden. Fünf viele Unbekannte sind noch unbekannt, es wird auch nie "leerer Zeichenfolge" sein, da Sie sich mit Zahlen und nicht mit Zeichenfolgen befassen.

Ich bin mir nicht sicher, was Sie mit "Wie kann ich den Compiler verhindern, ihn als ungültige Operation zu markieren?" Da dieser Code unter Visual Studio 2008 = gut für mich kompiliert und ausgeführt wird)

Ich bin mir nicht sicher, was Sie versuchen zu tun, aber wenn Sie möchten, dass V2 null ist, wenn V1 null ist, sollten Sie testen, ob V1 vor der Verwendung einen Wert hat.

int? v2 = v1.HasValue ? 5 * v1.Value : null;

oder

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top