¿Por qué funcionan la primera y la segunda escritura pero no la última? ¿Hay alguna forma en que pueda permitir a los 3 y detectar si fue 1, (int) 1 o si pasé? ¿Y realmente por qué se permite uno pero el último? El segundo permitido pero no el último realmente me deja sin aliento.
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!?
}
}
c#
compiler-errors
int
type-conversion
implicit-conversion
CodesInChaos
fuente
fuente
(short) i
.Respuestas:
Las dos primeras son expresiones constantes, la última 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 puede para las expresiones normales.
Esta regla está en línea con la directriz de que las conversiones implícitas no deberían tener pérdidas.
(Citado de C # Language Specification Version 3.0)
fuente
No hay conversión implícita de
int
ashort
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 unshort
valor 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.fuente
Expression<Func<int>>
? Luego podría pasar() => 1
o() => i
dentro de la función y podría inspeccionar si la entidad pasada contenía una variable capturada o un valor constante.un
int
literal se puede convertir implícitamente ashort
. Mientras:Entonces, los dos primeros funcionan porque se permite la conversión implícita de literales.
fuente
Creo que es porque está pasando literal / constante en los dos primeros, pero no hay conversión de tipo automática al pasar un número entero en el tercero.
Editar: ¡Alguien me ganó!
fuente
Porque no habrá ninguna conversión implícita entre el tipo no literal a un tamaño más corto.
La conversión implícita solo es posible para la expresión constante.
Donde como estás pasando
integer
valor como argumento parashort
fuente
El compilador le ha dicho por qué falla el código:
Entonces, esta es la pregunta que debe hacerse: ¿por qué falla esta conversión? Busqué en Google "c # convert int short" y terminé en la página de MS C # para la
short
palabra clave:http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx
Como dice esta página, las conversiones implícitas de un tipo de datos más grande
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 asegurarse de que ha evitado un error de fuera de rango en la lógica de su programa. Esa tranquilidad es proporcionada por un elenco.fuente
La conversión de int -> short puede provocar el truncamiento de datos. Es por eso.
fuente