2013-09-16 16 views
9

質問:
なぜ私は書かれていない以下のコードもコンパイルできますか?
私は厳格なオプションをオフにすると、オプションの推論がオンになっているという事実から離れて意味...なぜこのコードはコンパイルされますか?

If Not actdate.DayOfWeek = DayOfWeek.Saturday And Not actdate.DayOfWeek.Sunday Then 
... 
End If 
**編集:**ただ、VBに堪能でない人のため
が、それはoviouslyと同じです:覚えておくべき事はVB-`AND`が実際にビット単位とであるということですので、基本的には、すでに質問に答える
if (!(actdate.DayOfWeek == DayOfWeek.Saturday) & !actdate.DayOfWeek.Sunday) { 
... 
} 
+0

これは論理演算とビット演算の違いです。 http://msdn.microsoft.com/en-us/library/wz3k228a.aspx –

+0

なぜ、もし1 = 1そして "hi" Then ... 'もコンパイルされますか?それはあなたにランタイム例外を与えますが、それでもコンパイルします。 – Khan

+3

@ JefferyKhan:おそらく 'Option Strict'がオフであるためです。 – SLaks

答えて

9

受け入れられた回答が正しくないため、VB.NETの演算子優先順位によって、AndAlsoと同じ論理演算子が使用されます。左オペランドと右オペランドの両方とも、Not演算子が使用されているためBoolean型です。 VB.NETの優先順位は、リレーショナル>されない>です。 C#ではそうです! >関係> &。別の言い方をすれば、C#のようにVB.NETでカッコを使う必要はありません。

Visual BasicのNot演算子は、ブール式または数値式を受け入れます。 C#の場合と同様に、列挙型の値は、列挙型の基本型に一致する整数値型に暗黙的に変換可能です。この場合整数。 0の数値はFalseに変換されます。 DayOfWeek.Sundayの基になる値は0なので、Not式は常にTrueを生成します。

これは許容される構文です。

警告BC42025:あなたはしかし、あなたは、C#で取得エラーと非常に似て、このコードに対する警告、取得んインスタンスを介して共有メンバーのアクセス、一定のメンバー、列挙型のメンバーまたはネストされたタイプ。修飾表現は評価されません。

actdate.DayOfWeekプロパティ式で使用される日曜日の列挙型メンバーによって生成されます。それは確かにコードのにおいです。警告を無視しないことから、その警告をエラーにすることができます。プロジェクト+プロパティ、コンパイルタブ、警告設定セクション。 「インスタンス変数が共有メンバーにアクセスする」設定を「警告」から「エラー」に変更します。

+2

クラシック。私はそれを行うべきだと思うA.ああ、実際にそれはB.それは本当にCを行う、そしてまた間違っている、それは最終的にはBが何をしますか) –

関連する問題