Rozważmy statyczną klasę testową:Dlaczego błędy rzucania C# rzucają podczas prób wykonywania operacji matematycznych na typach całkowitych innych niż int?
public static class Test
{
public static ushort sum(ushort value1, ushort value2)
{
return value1 + value2
}
}
To powoduje następujący błąd kompilacji, z value1 + value2
podkreślone na czerwono:
nie można niejawnie przekonwertować typu 'int' do 'ushort'. Istnieje wyraźna konwersja (czy brakuje Ci obsady)?
Dlaczego?
Kompilator prosi użytkownika o wyraźne informowanie o tym, że dokonujesz zawężającej konwersji, w wyniku której dane mogą zostać utracone. Jeśli przejdziesz w ushort.MaxValue i 1, co powinno się stać? To jest pytanie, które kompilator przypomina ci o odpowiedzi. –
@Dan: Powinno się zdarzyć, że 'ushort' powinien automatycznie przepełnić lub wyrzucić wyjątek przepełnienia, jeśli użyte jest słowo kluczowe' checked'. Jeśli dodasz dwie wartości 'int', nie otrzymasz tego samego błędu kompilatora, mimo że możliwe jest przepełnienie. –
Moje ujęcie: przepełnienie to coś, co pojawia się w wyniku operacji, a nie zadania. W szczególności można przepełnić w trakcie złożonych obliczeń, nawet jeśli ostateczny wynik byłby w zakresie. Jeśli wystąpi przepełnienie, matematyka nie działa zgodnie z oczekiwaniami, ale nie ma to miejsca podczas dodawania dwóch usortowań w systemie 32-bitowym. Matematyka działała dobrze, ale teraz musisz zdecydować, jak interpretować wynik. Jeśli chcesz, aby przepełnienie zostało zmienione, możesz rzucić go bezpośrednio do ushorta. Może się to zdarzyć niejawnie, ale pomocna jest wymagająca jawna obsada. –