Intenté instalar Visual Studio 2015 y, al intentar compilar un proyecto antiguo, recibí la advertencia
CS0675 Bitwise-or operador utilizado en un operando de signo extendido; considere convertir primero a un tipo más pequeño sin firmar
para un fragmento de código que no da la misma advertencia al compilar en Visual Studio 2013. Descubrí que todo lo que se necesita para reproducir es este código muy simple:
short a = 0; int b = 0; a |= (short)b; Ahora, he leído esta pregunta SO , he leído la publicación de blog de Eric Lippert sobre este tema, y leí rápidamente sobre la extensión del signo , pero entiendo que la extensión del signo ocurre cuando emite desde un tipo de número firmado que consiste en un número más pequeño de bits a uno con mayor número de bits, como short a int por ejemplo.
Pero como estoy lanzando de int a short , no debería ocurrir ninguna extensión de signo si no me equivoco. El hecho de que esto no emita una advertencia en versiones anteriores de Visual Studio, me lleva a creer que debe ser un error en el compilador de Visual Studio 2015 (Roslyn). ¿Estoy malinterpretando cómo funciona la extensión de signo y/o el compilador aquí, o es más probable que se trate de un error del compilador?
Jon Skeet señaló que en realidad está ocurriendo una extensión de señal desde el | El operador no está definido para short , por lo que hay una conversión implícita a int antes de que el resultado vuelva a convertirse en short . Sin embargo, el compilador no debería haber emitido esta advertencia ya que el lanzamiento es inofensivo. Hubo un error en el compilador de Roslyn como se señaló en la respuesta aceptada.
La extensión de la señal está ocurriendo, pero posiblemente no por la razón obvia, y no de una manera preocupante, en mi opinión.
Este código:
a |= (short) b;es equivalente a:
// No warning here... (surprisingly, given that `a` is being sign-extended...) a = (short) (a | (short) b);Lo cual es equivalente a:
// No warning here... a = (short) ((int) a | (int) (short) b; porque el | El operador no está definido para operandos short de todos modos. Ambos operandos se promocionan a int , luego el resultado se convierte de nuevo a short .
No está claro por qué el compilador decide advertir en este caso, pero se está produciendo una extensión de señal... aunque de forma inofensiva.
Tenga en cuenta que recibe la misma advertencia si no hay variables int involucradas:
short a = 10; short b = 20; a |= b; // CS0675 Dada la forma en que el | el operador trabaja con yesos, esto me parece completamente inofensivo. No estoy seguro de si lo llamaría un error del compilador, pero definitivamente me parece un comportamiento no ideal. Hará ping a los miembros del equipo compilador de C# para ver lo que me he perdido :)
Esto es solo un error. El código para detectar e informar este error se agregó muy tarde en el desarrollo de VS2015 (ver https://github.com/dotnet/roslyn/issues/909 y https://github.com/dotnet/roslyn/pull/2416 ) y detecta demasiados casos en comparación con VS2013. Ahora hay un informe de error ( https://github.com/dotnet/roslyn/issues/4027 ) para reparar esto.