2013-09-16 23 views
9

Вопрос:
Почему код ниже (не написанный мной) даже компилируется?
Я имею в виду, кроме того факта, что вариант строги выключен и опции делают вывод, находится на ...Почему этот код даже компилируется?

If Not actdate.DayOfWeek = DayOfWeek.Saturday And Not actdate.DayOfWeek.Sunday Then 
... 
End If 
** Edit: **
Только для тех, кто не владеет VB, это oviously так же, как :
if (!(actdate.DayOfWeek == DayOfWeek.Saturday) & !actdate.DayOfWeek.Sunday) { 
... 
} 
, который в основном отвечает на вопрос уже, так что нужно помнить о том, что VB-`AND` на самом деле является побитовое и.
+0

В этом разница между логической и побитовой операцией. http://msdn.microsoft.com/en-us/library/wz3k228a.aspx –

+0

Тогда почему 'If 1 = 1 И" hi "Then ...' также компилируется? Это даст вам исключение во время выполнения, но все еще компилируется. – Khan

+3

@JefferyKhan: Возможно, потому что 'Option Strict' выключен. – SLaks

ответ

9

Принимаемый ответ неверен, приоритет оператора в VB.NET гарантирует, что используется логическая версия оператора And, такая же, как AndAlso. Как левый, так и правый операнды имеют тип Boolean благодаря используемым операторам Not. Приоритет в VB.NET является реляционным> Not> And. В C# это! > реляционные> &. Или, говоря иначе, вам не нужны скобки в VB.NET, как в C#.

Оператор Not в Visual Basic принимает логическое или числовое выражение. Как и в C#, значение перечисления неявно преобразуется в тип целочисленного значения, который соответствует базовому типу Enum. Целое число в этом случае. Числовое значение 0 преобразуется в значение False. Поскольку базовое значение DayOfWeek.Sunday равно 0, выражение Not всегда производит True.

Так что это приемлемый синтаксис. Тем не менее, вы получаете предупреждение для этого кода, очень похожее на ошибку, которую вы получаете на C#:

предупреждение BC42025: доступ к совместно используемому члену, постоянному члену, члену перечисления или вложенному типу через экземпляр; квалификационное выражение не будет оцениваться.

Произведено членом воскресного перечисления, используемым в выражении actdate.DayOfWeek. Это, безусловно, запах кода. Если не игнорировать предупреждения, вы можете превратить это предупреждение в сообщение об ошибке. Project + Properties, вкладка Compile, раздел Конфигурация предупреждений. Измените параметр «Переменная экземпляра доступа к общему члену» от «Предупреждение до ошибки».

+2

Classic. Я думаю, что это должно сделать А. О нет, на самом деле это делает Б. О, подождите, это действительно делает C. И снова неправильно, что это в конечном счете делает, это B;) –

Смежные вопросы