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 tiposbyte
,byte
,short
,ushort
,uint
oulong
, 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 tipoulong
, 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.