Sufixo literal para byte no .NET?

162

Eu estou querendo saber se existe alguma maneira de declarar uma variável de bytes em um curto caminho como flutuadores ou duplos? Quero dizer como 5fe 5d. Claro que eu poderia escrever byte x = 5, mas isso é um pouco inconseqüente se você usar varpara variáveis ​​locais.

Matthias
fonte
20
A maioria das pessoas aqui parece assumir que varé o único caso de uso. Existem outros casos de uso válidos. Por exemplo byte value = condition ? (byte)5 : (byte)6,.
Hameer Abbasi
@HameerAbbasi no seu caso, eu iria var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler
Um pouco maluco, talvez, mas você poderia ir com a byte value = condition ? ub5 : ub6;definição byte ub5 = 5, ub6 = 6;. hehe
intrepidis
@HameerAbbasi Por que você não faria byte value = condition ? 5 : 6;?
NetMage 30/08/19
@ NetMage Isso não funcionou no momento em que a pergunta foi publicada.
Hameer Abbasi 02/09/19

Respostas:

147

Não há menção de um sufixo literal na referência do MSDN para Byte , bem como na Especificação de Idioma do C # 4.0 . Os únicos sufixos literais em C # são para números inteiros e reais da seguinte maneira:

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

Se você deseja usar var, sempre pode converter o byte como emvar y = (byte) 5

Embora não esteja realmente relacionado, no C # 7, um novo prefixo binário foi introduzido 0b, informando que o número está no formato binário. Ainda não há sufixo para torná-lo um byte, por exemplo:

var b = 0b1010_1011_1100_1101_1110_1111; //int
Matt
fonte
21
0b1010_1011_1100_1101_1110_1111ainda é um Int32pensamento.
precisa saber é o seguinte
1
Você poderia fornecer um link para o documento C # 7 onde 0bé abordado.
user3613932 19/03
29

Então, adicionamos literais binários no VB no outono passado e recebemos feedback semelhante dos primeiros testadores. Decidimos adicionar um sufixo para byte para VB. Nós estabelecemos o SB (para byte assinado) e o UB (para byte não assinado). O motivo não é apenas B e SB é duplo.

Primeiro, o sufixo B é ambíguo se você estiver escrevendo em hexadecimal (o que significa 0xFFB?) E mesmo se tivéssemos uma solução para isso, ou outro caractere além de 'B' ('Y' foi considerado, F # usa isso) não é possível lembrar se o padrão foi assinado ou não - os bytes .NET não são assinados por padrão; portanto, faria sentido escolher B e SB, mas todos os outros sufixos são assinados por padrão, portanto, seria consistente com outros sufixos de tipo escolher B e UB. No final, optamos por SB e UB inequívocos. - Anthony D. Green,

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

Aparentemente, parece que eles fizeram essa ação no VB.NET (talvez não seja lançada no momento) e podem implementá-la em roslyn para C # - dê seu voto, se você acha que é algo que você gostaria. Você também teria a chance de propor uma possível sintaxe.

Erti-Chris Eelmaa
fonte
1
O sufixo ainda não está listado na página MSDN (atualizado em 20 de julho de 2015).
mbomb007
4
E ainda não parece ser implementado em VS 2017.
O Photon
2
Nem no VS 2019. Conforme a página do MSDN citada acima (atualizada em 30/01/2018): não existem caracteres do tipo identificador para os tipos de dados Booleano, Byte, Char, Data, Objeto, SByte, Curto, UInteger, ULong ou UShort ou para quaisquer tipos de dados compostos, como matrizes ou estruturas.
Pona
10

A partir desta página MSDN, parece que suas únicas opções são para elenco explicitamente ( var x = (byte)5), ou parar de usar var...

Dan Puzey
fonte
9
Não é apenas sobre var. Por exemplo,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen
@JohnGietzen, exatamente! No meu caso é Math.Max(myByte, (byte)1). E, BTW, você pode substituir o seu exemplo por this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,
Que tal usar atributos? por exemplo xUnit: [InlineData(1)]- [InlineData(1b)]ficaria muito melhor do que [InlineData((byte)1)](usando apenas 1poderia lançar uma exceção se o parâmetro for byte nulo e você dar-lhe um int)
Matthias Burger
3

Conforme o MSDN, você pode declarar um byte usando um literal decimal, hexadecimal ou binário.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;
Adrian Toman
fonte
7
Sim, mas byte x; x = predicate ? 0x05 : 0x00;é um erro porque o resultado do operador ternário é um int.
O fóton
1
@ThePhoton Você está certo! A única coisa que posso dizer é: WAT! destroyallsoftware.com/talks/wat
Adrian Toman
3
Isso não responde à pergunta. A pergunta não é sobre como posso inicializar um byte, mas sobre como posso dizer explicitamente "é um byte". com var x = 5, x é um int, com var x = 5d, x é um duplo. Ao usar o número como parâmetro em um atributo, isso se torna importante: um construtor com double pode fazer algo além de um construtor com int. (Pode não, mas poderia). Com sua resposta, você mostra apenas as diferentes possibilidades para inicializar isso x.
Matthias Burger
@ThePhoton VB.net vamos fazer isso. Dim x As Byte x = Se (predicado, & H05, & H00)
Brain2000