variable valores valor tipo tener referencia que por pasar parametros parametro objetos objeto inicializar debe como clase acepta c# compiler-errors int type-conversion implicit-conversion

valores - ref out c#



¿Por qué puedo pasar 1 como una variable corta, pero no la int? (7)

Conversión de int -> corto podría dar como resultado el truncamiento de datos. Es por eso.

¿Por qué la primera y la segunda escritura funcionan, pero no la última? ¿Hay alguna manera de que pueda permitir las 3 y detectar si fue 1, (int) 1 o pasé? ¿Y realmente por qué se permite uno sino el último? El segundo está permitido pero no el último realmente me deja boquiabierto.

Demostración para mostrar el error de compilación

using System; class Program { public static void Write(short v) { } static void Main(string[] args) { Write(1);//ok Write((int)1);//ok int i=1; Write(i);//error!? } }


Creo que es porque está pasando literalmente / constante en los dos primeros, pero no hay conversión de tipo automática cuando pasa un entero en el tercero.

Editar: ¡Alguien me ganó!


El compilador te ha dicho por qué falla el código:

cannot convert `int'' expression to type `short''

Así que aquí está la pregunta que debería hacerse: ¿por qué esta conversión falla? Busqué en Google "c # convert int short" y terminé en la página MS C # para la palabra clave short :

http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx

Como dice esta página, los lanzamientos implícitos de un tipo de datos mayor a short solo se permiten para literales. El compilador puede saber cuándo un literal está fuera de rango, pero no de otra manera, por lo que necesita la seguridad de que ha evitado un error fuera de rango en la lógica de su programa. Esa tranquilidad es proporcionada por un elenco.

Write((short)i)


Los primeros dos son expresiones constantes, el último no.

La especificación C # permite una conversión implícita de int a short para constantes, pero no para otras expresiones. Esta es una regla razonable, ya que para las constantes, el compilador puede garantizar que el valor se ajuste al tipo de destino, pero no para las expresiones normales.

Esta regla está en línea con la directriz de que las conversiones implícitas deben ser sin pérdida.

6.1.8 Conversiones de expresiones constantes implícitas

Una conversión de expresión constante implícita permite las siguientes conversiones:

  • Una expresión constante (§7.18) de tipo int se puede convertir a tipo sbyte , byte , short , ushort , uint o ulong , siempre que el valor de la expresión constante esté dentro del rango del tipo de destino.
  • Una expresión constante de tipo long se puede convertir a tipo ulong , siempre que el valor de la expresión constante no sea negativo.

(Citado de C # Language Specification Version 3.0)


No hay conversión implícita de int a short debido a la posibilidad de truncamiento. Sin embargo, el compilador puede tratar una expresión constante como del tipo de destino.

1 ? No es un problema: es claramente un valor short válido. i ? No tanto - podría ser algún valor> short.MaxValue por ejemplo, y el compilador no puede verificar eso en el caso general.


Porque no habrá ninguna conversión implícita entre tipo no literal a corto de mayor tamaño.

La conversión implícita solo es posible para la expresión constante.

public static void Write(short v) { }

Donde estás pasando integer valor integer como un argumento para short

int i=1; Write(i); //Which is Nonliteral here


un int literal se puede convertir implícitamente en short . Mientras:

No puede convertir implícitamente los tipos numéricos no literales de mayor tamaño de almacenamiento a corto

Entonces, los primeros dos funcionan porque la conversión implícita de literales está permitida.