2010-07-30 13 views
49

Patrzyłem na this article i staram się postępować zgodnie z przykładem VB.NET, który wyjaśnia zniesione operatory. Nie ma tu odpowiednika przykładu C# lub samouczka. Nie mam dużego doświadczenia z przeciążaniem operatorów w ogóle, więc próba pogodzenia się z odpowiednikiem VB.NET podczas czytania na temat typów zerowiących prawdopodobnie nie jest najlepszym miejscem do rozpoczęcia ...Co to są operatorzy zniesione?

Czy ktoś byłby w stanie przedstawić wyjaśnienie zniesionych operatorów i jak są one używane przez typy zerowujące? Czy oznacza to tylko, że typ zerowalny sam nie przeciąża operatorów i użyje operatorów od typu podstawowego, który reprezentuje?

Nie ma zbyt wielu informacji na temat SO związanych z operatorami zniesionymi, więc mam nadzieję, że może to pomóc także innym osobom.

Dzięki

+0

Ah .. Pomyślałem, że (null >> 1) był nieważny i zastanawiałem się, dlaczego tak jest? wydaje się działać na x w drugim zestawieniu (int? x = null; (x >> 1)? -1;). Myślałem, że ?? "przekształca" go w prawidłową formę ((x == null)? -1: (x >> 1);). Okazuje się, że działa na (x >> 1), a ta (null >> 1) jest ważna. – blizpasta

Odpowiedz

92

podnoszone operatorzy są operatorzy, którzy pracują nad pustych typów „Podnoszenie” przez podmioty, które już istnieją w formie non-pustych. Na przykład, jeśli wykonasz:

int? x = 10; 
int? y = 10; 
int? z = x + y; 

Ten operator "+" zostanie zniesiony. W rzeczywistości nie istnieje on na Nullable<int>, ale kompilator C# działa tak, jak robi, generując kod, który robi to, co trzeba. (W większości przypadków jest to kwestia sprawdzenia, czy dowolny argument jest zerowy, a jeśli tak, wynik jest zerowy.) W przeciwnym razie odtwórz oba operandy do ich wartości nienależących do wartości null, użyj operatora normalnego, a następnie zawiń wynik z powrotem do Istnieje kilka szczególnych przypadków podobnych porównań.)

Aby uzyskać więcej informacji, patrz punkt 6.4.2 (Operatory konwersji podniesionej) i 7.3.7 (Operatory podnoszone) C# spec.

+3

Ta odpowiedź nie mówi nic o tym, czym właściwie jest "właściwa rzecz", co uważam za najważniejszy aspekt działania podnoszonych operatorów. – Ani

+0

@JonSkeet: Twój link kieruje do specyfikacji C# 5; Czy chciałeś powiedzieć 5 tutaj lub link do 4 specyfikacji? –

+0

@ Cᴏʀʏ: To była specyfikacja C# 4, kiedy połączyłem się z nią, ale ten link teraz idzie do specyfikacji C# 5 ... może to być specyfikacja C# 6 za kilka miesięcy :) –