Encontré un problema interesante que el siguiente código se ejecuta con un resultado diferente:
char c = 'a'; c += 'a'; //passed c = c + 'a'; //Cannot implicitly convert type 'int' to 'char'. An explicit conversion exists (are you missing a cast?) ¿Hay alguna diferencia entre a += b y a=a+b , o simplemente se perdió la verificación del código del compilador?
Mi punto es por qué char += char puede pasar la verificación de código mientras que char = (char+char) consideró char = int ?
Especificación de C# , Sección 7.17.2 Asignación de compuestos:
Una operación de la forma
x op= yse procesa aplicando la resolución de sobrecarga del operador binario (§7.3.4) como si la operación se escribierax op y. Después,...
• De lo contrario, si el operador seleccionado es un operador predefinido, si el tipo de retorno del operador seleccionado es explícitamente convertible al tipo de
x, y siyes implícitamente convertible al tipo dexo el operador es un operador de desplazamiento, entonces el la operación se evalúa comox = (T)(x op y), dondeTes el tipo dex, excepto quexse evalúa solo una vez
Y esa es exactamente la situación que tenemos aquí. El tipo de retorno de la operación es int pero los tipos de x e y son ambos char , por lo que se inserta automáticamente una conversión adicional para nosotros.
(Creo que esta regla existe porque no hay ningún lugar para que usted pueda insertar un molde explícito usted mismo y se "espera" que funcione, especialmente en los casos en que x e y son del mismo tipo)
En el segundo caso, es la tarea la que está fallando, no el cálculo en sí. Si lanza explícitamente el resultado en la segunda línea a un carácter, funciona bien y, de hecho, las siguientes tres líneas generan IL idénticos:
c += (char)1; c = (char)(c + (char)1); c = (char)(c + 1);Entonces sí. Hay una diferencia.
Tenga en cuenta que en la tercera línea no me molesté en convertir el 1 en char , ya que el cálculo simplemente lo convertirá de nuevo en un int de todos modos.
El tipo resultante de += es char en este caso y el tipo resultante de c + (char)1 es int.
Se imprime el siguiente código:
o1 Sistema.Char o2 Sistema.Int32
public static void Main(string[] args) { char c = 'a'; object o1 = c += (char)1; object o2 = c + (char)1; WriteLine("o1 " + o1.GetType()); WriteLine("o2 " + o2.GetType()); }