2012-04-18 13 views
1

私はオブジェクト指向の背景から来ています。なぜ、このコードの断片に "テスト"(引用符に気づく)が(メッセージボックス内に)表示されますか?私は論理テストを期待しています: 'If Test = "True"' Falseを返すには、バリアントに文字列ではなくブール値が含まれているためです。したがって、私は、メッセージボックスが表示されるように期待していないだろうが、それはありません:VB6バリアントタイプ

Dim Test As Variant 

Test = True 

If Test = "True" Then //line 5 
    MsgBox ("Test") 
End If 
+0

あなたのコードをしようとする使用する必要がありますが、文字列を示しているので、テストは、メッセージボックスに表示されている単語がある理由「テスト」あなたのメッセージボックスに

MsgBox ("Test") 

コンパイラが知る限り論理的なyes/noを "foobar"と比較してください。どのようにあなたはそれがうまくいくのですか?コンパイラは、文字列をブール値に変換して比較するコードを生成する必要がありますか?またはブール値を文字列に変換するコードを生成する必要がありますか? "True"を "foobar"に置き換えると、プログラムはクラッシュしません。それを試してみてください。今あなたは知っている。 –

答えて

8

Variant型VB6の値(およびそれらをサポートする他のほとんどの言語)、必要に応じて自動的にデータ型の変換を、 COM相互作用で広く使用されています。

使用しているコードはここに文字列にブールから自動的に(暗黙の)変換を使用しています

:それはここにここ

Test = True 

元割り当てられたタイプ(ブール値)だとして、それを使用した後

if Test = "True" 

しかし、あなたはバリアントをまったく使用していません。ハードコーディングされた文字列​​を使用しています。

+0

私はTestという単語がMessageBoxに現れ、True/Falseでない理由を理解しています!あなたの答えの2番目の部分が私の懸念に対処します。変数は次のとおりです。テストは暗黙的に私のコードの5行目の文字列にキャストされます(私は元の質問の5行目にラベルを付けました)? – w0051977

+0

@KirkWoll、そうです。無関係のテキストを削除しました。ありがとう。 :) w0051977:はい、使用法に基づいて必要に応じて暗黙の(自動)変換です。そのため、それは「異形」と呼ばれています(必要に応じてタイプが変わります)。 –

+2

VB6は、この回答に示唆されているような変形だけでなく、**任意の**データタイプのデータタイプ間で自動的に変換します。この変換は、暗黙の型変換または邪悪型変換と呼ばれることがあります([pdf](http://vb.mvps.org/articles/pt199511.pdf))。これは広く嫌われているので、VB.Netで[Option Strictが導入されました](http://stackoverflow.com/questions/222370)。 – MarkJ

0

彼らはあなたがこの

MsgBox (Test) 
+1

[関数の結果を使用しないときは、パラメータの前後に角括弧を使用しないでください](http://stackoverflow.com/a/10108489/588306)または「呼び出し」。 – Deanna