oparte na tym ciekawym pytaniem: Addition of int and uint i toying wokół z stałej składania jak wspomniano w Nicholas Carey'sanswer, ja natknęliśmy się na pozornie niespójne zachowanie kompilatora:Odjęcie uint oraz int i ciągłe składanie
Rozważmy następujący fragment kodu:
int i = 1;
uint j = 2;
var k = i - j;
tu kompilator poprawnie rozwiązuje k
do long
. To szczególne zachowanie jest dobrze określone w specyfikacjach, jak wyjaśniono w odpowiedziach na poprzednie pytanie.
Co było zaskakujące dla mnie, jest to, że zachowanie zmienia się, gdy do czynienia z dosłownych stałych lub stałych w ogóle. Czytając Nicholas Carey answer zdałem sobie sprawę, że zachowanie może być niezgodne więc sprawdziłem i rzeczywiście:
const int i = 1;
const uint j = 2;
var k = i - j; //Compile time error: The operation overflows at compile time in checked mode.
k = 1 - 2u; //Compile time error: The operation overflows at compile time in checked mode.
k
w tym przypadku został rozwiązany do Uint32
.
Czy istnieje powód, dla którego zachowanie różni się, gdy mamy do czynienia z stałych lub jest to mały, ale niefortunny "błąd" (brak lepszego terminu) w kompilatorze?
Przy odgadywaniu kompilator nie wykonuje niejawnych konwersji stałych. – Powerlord
@Powerlord Cóż, to przecież jest * to * niejawna konwersja 'int' na' uint'. – InBetween
Specyfikacja pozwala na to, chociaż ... §6.1.9 Konwersja stałych konwersji wyrażenia: "Wyrażenie stałe (§7.19) typu int może zostać przekonwertowane na typ' sbyte', 'byte',' short', ' ushort', 'uint' lub' ulong', pod warunkiem, że wartość wyrażenia stałego mieści się w zakresie typu miejsca docelowego. " Nadal próbuję znaleźć to, co mówi literały i/lub stałe zmienne. – Powerlord