Aclaro el negocio unchecked
. El MSDN page indica que unchecked
se usa para evitar la verificación de desbordamiento, que de lo contrario, cuando está dentro de un contexto marcado, produce un error de compilación o arroja una excepción.
... IF dentro de un contexto verificado.
El contexto se comprueba de forma explícita:
checked { ... }
o implícitamente *, cuando se trata de tiempo de compilación constantes de:
byte b = (byte)-6; //compile error
byte b2 = (byte)(200 + 200); //compile error
int i = int.MaxValue + 10; //compiler error
Pero cuando se trata de tiempo de ejecución variables, el contexto es unchecked
por defecto **:
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
Para resumir y responder a la pregunta original:
Necesidad byte<->sbyte
conversión en constantes? Utilice unchecked
y reparto:
byte b = unchecked((byte) -6);
Necesidad byte<->sbyte
la conversión de las variables ? Justo reparto:
sbyte sb = -6;
byte b = (byte) sb;
* Hay una tercera forma de obtener un contexto marcado por defecto: por ajustar la configuración del compilador. P.ej. Visual Studio -> Propiedades del proyecto -> Build -> Avanzado ... -> [X] Compruebe si la aritmética desbordamiento/subdesbordamiento
** El contexto de ejecución está marcada por defecto en C#. En VB.NET, por ejemplo, el contexto de tiempo de ejecución predeterminado es COMPROBADO.
¿Por qué no simplemente lo convierte en 'byte'? – V4Vendetta
@ V4Vendetta: Funcionará, leo en alguna parte si el valor está fuera de rango, que es negativo en sbyte, arrojará una excepción. –
Bueno, realmente no dice que es -1, entonces lo obtendría como 255 – V4Vendetta