Mam dwa obiekty w języku C# i nie wiem, czy jest to wartość logiczna czy inny typ. Jednak gdy próbuję porównać te w C# nie otrzymuje prawidłowej odpowiedzi. Próbowałem tego samego kodu z VB.NET i się udało.
Czy macie jakiś pomysł jak mogę rozwiązać ten problrem?
C#:
object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Wynik: Fałsz
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()) // Wynik: Prawda
1 odpowiedź
W języku C# operator ==
(zastosowany do wyrażeń typu odwołania) wykonuje kontrolę równości odniesienia, chyba że jest przeciążony. Porównujesz dwa odniesienia, które są wynikiem konwersji boksu, więc są to odrębne odniesienia.
W przypadku typów, które przeciążają ==,
możesz uzyskać inne działanie -
ale jest to oparte na typie wyrażeń w czasie kompilacji. Na przykład: ciąg zapewnia ==
(ciąg, ciąg):
string x = new string("abc".ToCharArray());
string y = new string("abc".ToCharArray());
Console.WriteLine(x == y); // Prawda
Console.WriteLine((object) x == (object) y); // Fałsz
Tutaj pierwsze porównanie wykorzystuje przeciążonego operatora, ale drugie korzysta z „domyślnego” porównania referencyjnego. W Visual Basic operator =
wykonuje o wiele więcej pracy - nie jest to nawet równoważne z używaniem object.Equals (x, y)
, ponieważ takie rzeczy jak porównanie opcji może mieć wpływ na porównanie tekstu. Zasadniczo mówiąc, operatorzy nie działają w ten sam sposób i nie mają działać w ten sam sposób.