Dlaczego C# porównuje ze sobą dwa typy obiektów, a VB nie?

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.

Twoja odpowiedź

Zaloguj się aby odpowiedzieć.

Operiada

Operiada to polskojęzyczne forum informatyczne działające na zasadzie pytań i odpowiedzi.

Obserwowane tagi

Zaloguj się aby obserwować tagi.