Myślę, że wygląda to jak błąd w kompilatorze C#.Dlaczego kompilator ocenia pozostałą wartość MinValue% -1 inną niż środowisko wykonawcze?
Rozważmy następujący kod (wewnątrz metody):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
kompiluje bez błędów (lub ostrzeżenia). Wygląda jak błąd. Po uruchomieniu wydrukuje 0
na konsoli.
Wtedy bez const
, kod:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
Gdy ta jest prowadzona, to poprawnie Skutkuje to OverflowException
wyrzucane.
Specyfikacja języka C# wspomina o tym przypadku i mówi, że zostanie wyrzucony System.OverflowException
. Nie zależy to od kontekstu, jak się wydaje (również błąd związany ze stałymi operandami w czasie kompilacji z pozostałym operatorem jest taki sam z checked
i unchecked
).
Ten sam błąd występuje z int
(System.Int32
), a nie tylko long
(System.Int64
).
Dla porównania kompilator obsługuje dividend/divisor
z const
operandami znacznie lepiej niż dividend % divisor
.
Moje pytania:
Mam rację, to jest błąd? Jeśli tak, to czy jest to dobrze znany błąd, że nie chcą, aby naprawić (ze względu na kompatybilność wsteczną, nawet jeśli jest to raczej głupie korzystać % -1
z kompilacji stałą -1
)? Czy powinniśmy to zgłosić, aby mogli go naprawić w nadchodzących wersjach kompilatora C#?
Wspomnienie @EricLippert może przyciągnąć odpowiedni tłum na to pytanie :) –
@Morten, w tym momencie może po prostu otumanić wzrokiem ze swojego okonia w Coverity. ;) –
Myślę, że powinieneś dać nagrodę, ponieważ irytuje mnie, dlaczego tak się dzieje. Specyfikacja mówi, że każde wyrażenie stałe, które może rzucić wyjątek w czasie wykonywania, powinno spowodować kompilację podczas kompilacji !! –