¿Sufijo literal para byte en .NET?

162

Me pregunto si hay alguna forma de declarar una variable de byte de forma corta como flotantes o dobles. Me refiero a me gusta 5fy 5d. Claro que podría escribir byte x = 5, pero eso es un poco intrascendente si lo usas varpara variables locales.

Matías
fuente
20
La mayoría de las personas aquí parecen asumir que vares el único caso de uso. Hay otros casos de uso válidos. Por ejemplo, byte value = condition ? (byte)5 : (byte)6.
Hameer Abbasi
@HameerAbbasi en tu caso, iría var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler
Tal vez un poco loco, pero podrías ir byte value = condition ? ub5 : ub6;definiendo byte ub5 = 5, ub6 = 6;. jeje
intrepidis
@HameerAbbasi ¿Por qué no lo harías byte value = condition ? 5 : 6;?
NetMage
@NetMage Eso no funcionó cuando se publicó la pregunta.
Hameer Abbasi

Respuestas:

147

No se menciona un sufijo literal en la referencia de MSDN para Byte ni en la Especificación de lenguaje C # 4.0 . Los únicos sufijos literales en C # son números enteros y reales de la siguiente manera:

u = uint
l = long
ul = ulong
f = float
m = decimal
d = double

Si desea usar var, siempre puede emitir el byte como envar y = (byte) 5

Aunque no está realmente relacionado, en C # 7, se introdujo un nuevo prefijo binario 0b, que establece que el número está en formato binario. Sin embargo, todavía no hay sufijo para convertirlo en un byte, por ejemplo:

var b = 0b1010_1011_1100_1101_1110_1111; //int
Mate
fuente
21
0b1010_1011_1100_1101_1110_1111sigue siendo un Int32pensamiento
BanksySan
1
¿Podría proporcionar un enlace al documento C # 7 donde 0bestá cubierto?
user3613932
29

Entonces, agregamos literales binarios en VB el otoño pasado y obtuvimos comentarios similares de los primeros evaluadores. Decidimos agregar un sufijo para byte para VB. Nos decidimos por SB (para byte firmado) y UB (para byte sin firmar). La razón no es solo B y SB es doble.

Uno, el sufijo B es ambiguo si está escribiendo en hexadecimal (¿qué significa 0xFFB?) E incluso si tuviéramos una solución para eso, u otro carácter que no sea 'B' ('Y' fue considerado, F # usa esto) no uno podría recordar si el valor predeterminado fue firmado o sin firmar: los bytes .NET no están firmados de manera predeterminada, por lo que tendría sentido elegir B ​​y SB, pero todos los demás sufijos están firmados de forma predeterminada, por lo que sería coherente con otros sufijos de tipo elegir B ​​y UB Al final fuimos por SB y UB inequívocos. - Anthony D. Green,

https://roslyn.codeplex.com/discussions/542111

Aparentemente, parece que han hecho este movimiento en VB.NET (es posible que no se publique en este momento), y podrían implementarlo en Roslyn para C #. Ve a votar, si crees que es algo que te gustaría. También tendría la oportunidad de proponer una posible sintaxis.

Erti-Chris Eelmaa
fuente
1
El sufijo aún no figura en la página de MSDN (actualizado el 20 de julio de 2015).
mbomb007
44
Y todavía no parece implementarse en VS 2017.
The Photon
2
Ni en VS 2019. Según la página de MSDN citada anteriormente (actualizado 30/01/2018): No existen caracteres de tipo de identificador para los tipos de datos booleanos, Byte, Char, Fecha, Objeto, SByte, Short, UInteger, ULong o UShort , o para cualquier tipo de datos compuestos, como matrices o estructuras.
Pona
10

Desde esta página de MSDN, parece que sus únicas opciones son emitir explícitamente ( var x = (byte)5), o dejar de usar var...

Dan Puzey
fuente
9
No se trata solo de eso var. Por ejemplo,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen
@JohnGietzen, exactamente! En mi caso lo es Math.Max(myByte, (byte)1). Y, por cierto, puede reemplazar su ejemplo a:, this.pixels[x, y] = (byte)(condition ? 0 : 1);que para mí se ve un poco mejor, othis.pixels[x, y] = Convert.ToByte(!condition);
Shimmy Weitzhandler
¿Qué tal usar en atributos? por ejemplo, xunit: [InlineData(1)]- [InlineData(1b)]se vería mucho mejor que [InlineData((byte)1)](usar solo 1podría arrojar una excepción si el parámetro es un byte anulable y le da un int)
Matthias Burger
3

Según MSDN , puede declarar un byte utilizando un decimal decimal, hexadecimal o literal binario.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;
Adrian Toman
fuente
77
Sí, pero byte x; x = predicate ? 0x05 : 0x00;es un error porque el resultado del operador ternario es un int.
El Photon
1
@ThePhoton ¡Tienes razón! Lo único que puedo decir es: ¡WAT! destroyallsoftware.com/talks/wat
Adrian Toman
3
Esto no responde la pregunta. La pregunta no se trata de cómo puedo inicializar un byte, sino de cómo puedo decir explícitamente "es un byte". con var x = 5, x es un int, con var x = 5d, x es un doble. Cuando se usa el número como parámetro en un atributo, esto se vuelve importante: un constructor con doble podría hacer algo más que un constructor con int. (Puede que no, pero podría). Con su respuesta, solo muestra las diferentes posibilidades para inicializar eso x.
Matthias Burger
@ThePhoton VB.net te permite hacer eso. Dim x As Byte x = If (predicado, & H05, & H00)
Brain2000