2013-09-16 14 views
9

Frage:
Warum kompiliert der folgende Code (nicht von mir geschrieben)?
ich meine abgesehen von der Tatsache, dass Option aus streng ist und Option infer ist auf ...Warum kompiliert dieser Code überhaupt?

If Not actdate.DayOfWeek = DayOfWeek.Saturday And Not actdate.DayOfWeek.Sunday Then 
... 
End If 
** Edit: **
Gerade für diejenigen, die nicht fließend in VB, es ist die gleiche wie oviously :
if (!(actdate.DayOfWeek == DayOfWeek.Saturday) & !actdate.DayOfWeek.Sunday) { 
... 
} 
, die im Grunde die Frage bereits beantwortet, da die Sache ist, sich daran zu erinnern, dass die VB-`AND` tatsächlich eine bitweise ist und.
+0

Das ist der Unterschied zwischen logischem und bitweisem Betrieb. http://msdn.microsoft.com/en-us/library/wz3k228a.aspx –

+0

Warum dann 'If 1 = 1 Und" hi "Dann ...' auch kompilieren? Es gibt Ihnen eine Laufzeitausnahme, kompiliert aber trotzdem. – Khan

+3

@ JefferyKhan: Wahrscheinlich weil 'Option Strict' ausgeschaltet ist. – SLaks

Antwort

9

Die akzeptierte Antwort ist nicht korrekt, Operatorenpräzedenz in VB.NET stellt sicher, dass die logische Version von And-Operator verwendet wird, dieselbe wie AndAlso. Sowohl der linke als auch der rechte Operand sind vom Typ Boolean, da die Not-Operatoren verwendet werden. Vorrang in VB.NET ist relational> Not> Und. In C# ist es! > relational> &. Oder anders gesagt, Sie benötigen in VB.NET keine Klammern wie in C#.

Der Not-Operator in Visual Basic akzeptiert einen booleschen oder numerischen Ausdruck. Genau wie in C# ist ein Enum-Wert implizit in einen ganzzahligen Werttyp konvertierbar, der dem Basistyp der Enum entspricht. Ganzzahl in diesem Fall. Ein numerischer Wert von 0 wird in False konvertiert. Da der DayOfWeek.Sunday-Wert 0 ist, erzeugt der Not-Ausdruck immer True.

Das ist also eine akzeptable Syntax. Sie erhalten jedoch eine Warnung für diesen Code, sehr ähnlich den Fehler, den Sie in C# erhalten:

Warnung BC42025: Zugriff gemeinsamen Mitglied, ständigen Mitglied, Aufzählungsmember oder verschachtelter Art über eine Instanz; qualifizierende Ausdrücke werden nicht ausgewertet.

Produziert von dem Sunday-Enum-Member, das im actdate.DayOfWeek-Property-Ausdruck verwendet wird. Das ist sicherlich ein Code-Geruch. Wenn Sie Warnungen nicht ignorieren, können Sie diese Warnung in einen Fehler umwandeln. Projekt + Eigenschaften, Registerkarte Kompilieren, Abschnitt Warnkonfiguration. Ändern Sie die Einstellung "Instanzvariable greift auf freigegebenes Element zu" von "Warnung" auf "Fehler".

+2

Klassisch. Ich denke, es sollte A tun. Oh nein, eigentlich tut es B. Oh, warte, es tut wirklich C. Und wieder falsch, was es letztendlich macht, ist B;) –

Verwandte Themen