2013-09-16 20 views
9

Domanda:
Perché il seguente codice (non scritto da me) viene compilato?
Voglio dire a parte il fatto che l'opzione rigorosa è spento e l'opzione inferire è in ...Perché questo codice è stato compilato?

If Not actdate.DayOfWeek = DayOfWeek.Saturday And Not actdate.DayOfWeek.Sunday Then 
... 
End If 
** Edit: **
Solo per chi non è fluente in VB, è lo stesso di oviously :
if (!(actdate.DayOfWeek == DayOfWeek.Saturday) & !actdate.DayOfWeek.Sunday) { 
... 
} 
che risponde fondamentalmente la domanda già, dal momento che la cosa da ricordare è che il VB-`AND` è in realtà un bit a bit e.
+0

Questa è la differenza tra operazione logica e bit a bit. http://msdn.microsoft.com/en-us/library/wz3k228a.aspx –

+0

Allora perché 'Se 1 = 1 E" ciao "Allora ...' compili anche? Ti darà un'eccezione di runtime, ma verrà comunque compilata. – Khan

+3

@JefferyKhan: Probabilmente perché "Option Strict" è disattivato. – SLaks

risposta

9

La risposta accettata non è corretta, la precedenza dell'operatore in VB.NET garantisce che venga utilizzata la versione logica dell'operatore And, la stessa di AndAlso. Sia gli operandi di sinistra che quelli di destra sono di tipo Booleano grazie agli operatori Not in uso. La precedenza in VB.NET è relazionale> Non> E. In C# è! > relazionale> &. O per dirla in un altro modo, non hai bisogno di parentesi in VB.NET come fai in C#.

L'operatore Not in Visual Basic accetta un'espressione booleana o numerica. Proprio come in C#, un valore enum è implicitamente convertibile in un tipo di valore integrale che corrisponde al tipo di base di Enum. Integer in questo caso. Un valore numerico di 0 viene convertito in False. Poiché il valore sottostante di DayOfWeek.Sunday è 0, l'espressione Not produce sempre True.

Quindi questa è una sintassi accettabile. Dovete comunque ottenere un avvertimento per questo codice, molto simile all'errore che si ottiene in C#: BC42025

avvertimento: L'accesso di membro condiviso, membro costante, membro enum o tipo annidato attraverso un'istanza; l'espressione qualificante non verrà valutata.

Prodotto dal membro di enum della domenica utilizzato nell'espressione di proprietà actdate.DayOfWeek. Questo è certamente un odore di codice. A parte il non ignorare gli avvertimenti, è possibile trasformare questo avviso in un errore. Progetto + Proprietà, scheda Compila, sezione Configurazione avviso. Modifica l'impostazione "Instance variable accesses shared member" da Warning to Error.

+2

Classico. Penso che dovrebbe fare A. Oh no, in realtà fa B. Oh aspetta, fa davvero C. E di nuovo sbagliato, ciò che alla fine fa è B;) –

Problemi correlati