C# に 2 つのオブジェクトがあり、それがブール型か他の型かわかりません。ただし、それらを比較しようとすると、C# は正しい答えを返しません。同じコードを VB.NET で試してみたところ、うまくいきました。
解決策があれば、これを修正する方法を教えていただけますか?
C#:
object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Outputs False !!
VB.NET:
Dim a As Object = True
Dim b As Object = True
Dim c As Object = False
If (a = b) Then c = True
MessageBox.Show(c.ToString()) '// Outputs True
ベストアンサー1
C#では、==
演算子(参照型式に適用された場合)は、参照同等性チェックは過負荷ボクシング変換の結果である 2 つの参照を比較しているので、それらは異なる参照です。
編集: をオーバーロードする型では==
、異なる動作を得ることができますが、それは に基づいていますコンパイル時式の型。たとえば、string
provides ==(string, string
):
string x = new string("foo".ToCharArray());
string y = new string("foo".ToCharArray());
Console.WriteLine(x == y); // True
Console.WriteLine((object) x == (object) y); // False
ここで、最初の比較ではオーバーロードされた演算子が使用されていますが、2 番目の比較では「デフォルト」の参照比較が使用されています。
VBでは、=
演算子はさらに多くのことを行います。単に を使用するのと同等ではありませんobject.Equals(x, y)
。Option Compare
テキストの比較方法に影響を与える可能性があります。
基本的に、演算子は同じ方法で動作せず、意図されました同じように動作します。