Vorrei chiarire la unchecked
business. Lo MSDN page indica che unchecked
viene utilizzato per impedire il controllo di overflow, che altrimenti, all'interno di un contesto controllato, fornire un errore di compilazione o generare un'eccezione.
... IF all'interno di un contesto verificato.
Il contesto è controllato in maniera esplicita:
checked { ... }
o implicitamente *, quando si tratta di in fase di compilazione costanti:
byte b = (byte)-6; //compile error
byte b2 = (byte)(200 + 200); //compile error
int i = int.MaxValue + 10; //compiler error
Ma quando si tratta di runtime variabili, il contesto è unchecked
per impostazione predefinita **:
sbyte sb = -6;
byte b = (byte)sb; //no problem, sb is a variable
int i = int.MaxValue;
int j = i + 10; //no problem, i is a variable
Per riassumere e rispondere alla domanda iniziale:
Bisogno byte<->sbyte
conversione sul costanti? Utilizzare unchecked
e cast:
byte b = unchecked((byte) -6);
Bisogno byte<->sbyte
conversione sul variabili? Basta Cast:
sbyte sb = -6;
byte b = (byte) sb;
* C'è un terzo modo per ottenere un contesto selezionata per impostazione predefinita: modificando le impostazioni del compilatore. Per esempio. Visual Studio -> Proprietà del progetto -> Build -> Avanzate ... -> [X] Controllare l'aritmetica di overflow/underflow
** Il contesto di esecuzione è deselezionata per impostazione predefinita in C#. Ad esempio, in VB.NET, il contesto di runtime predefinito è CONTROLLATO.
Perché non basta lanciarlo su 'byte'? – V4Vendetta
@ V4Vendetta: Funzionerà, leggo da qualche parte se il valore è fuori intervallo, che è negativo su sbyte, genererà un'eccezione. –
Beh, non dire veramente il suo -1 allora si otterrebbe come 255 – V4Vendetta