Буквальный суффикс для байта в .NET?


162

Мне интересно, есть ли способ объявить байтовую переменную коротким способом, например, с плавающей запятой или с удвоением? Я имею в виду, как 5fи 5d. Конечно, я мог бы написать byte x = 5, но это немного несущественно, если вы используете varдля локальных переменных.


20
Большинство людей здесь, кажется, считают, varчто это единственный вариант использования. Есть и другие допустимые варианты использования. Например, byte value = condition ? (byte)5 : (byte)6.
Хамир Аббаси

@HameerAbbasi в твоем случае я бы пошел var value = (byte)(condition ? 5 : 6);.
Шимми Вайцхандлер,

Может быть, немного помешаны, но вы могли бы пойти с byte value = condition ? ub5 : ub6;определением byte ub5 = 5, ub6 = 6;. хе - хе
intrepidis

@HameerAbbasi Почему бы тебе просто не сделать byte value = condition ? 5 : 6;?
NetMage

@NetMage Это не сработало на момент публикации вопроса.
Хамир Аббаси

Ответы:


147

Там нет упоминания буквального суффикса в справочнике MSDN для байта, а также в спецификации языка C # 4.0 . Единственные литеральные суффиксы в C # предназначены для целых и действительных чисел следующим образом:

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

Если вы хотите использовать var, вы всегда можете бросить байт, как вvar y = (byte) 5

Хотя это и не связано, в C # 7 был введен новый двоичный префикс 0b, в котором указано, что число находится в двоичном формате. Тем не менее, нет суффикса, чтобы сделать его байтом, например:

var b = 0b1010_1011_1100_1101_1110_1111; //int

22
0b1010_1011_1100_1101_1110_1111все еще Int32хотя.
BanksySan

1
Не могли бы вы предоставить ссылку на документ C # 7, где 0bрассматривается.
user3613932

29

Итак, мы добавили двоичные литералы в VB прошлой осенью и получили аналогичные отзывы от ранних тестеров. Мы решили добавить суффикс для байта для VB. Мы остановились на SB (для подписанного байта) и UB (для неподписанного байта). Причина не только в том, что B и SB двойственны.

Во-первых, суффикс B является неоднозначным, если вы пишете в шестнадцатеричном формате (что означает 0xFFB?), И даже если у нас было решение для этого или другой символ, чем «B» (считалось «Y», F # использует это), нет можно было бы вспомнить, был ли подписан по умолчанию или без знака - байты .NET по умолчанию не подписаны, поэтому имеет смысл выбирать B и SB, но все остальные суффиксы подписываются по умолчанию, поэтому было бы совместимо с суффиксами других типов для выбора B и UB. В итоге мы пошли на однозначные SB и UB. - Энтони Д. Грин,

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

Видимо, кажется, что они сделали этот шаг в VB.NET (может быть, не выпущен прямо сейчас), и они могли бы реализовать это в roslyn для C # - иди отдать свой голос, если вы думаете, что это то, что вы хотели бы. У вас также будет возможность предложить возможный синтаксис.


1
Суффикс до сих пор не указан на странице MSDN (обновлено 20 июля 2015 г.).
mbomb007

4
И до сих пор, похоже, не реализована в VS 2017.
The Photon

2
Ни в VS 2019. Согласно приведенной выше странице MSDN (обновлено 30.01.2008): для типов данных Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong или UShort не существует символов идентификатора. или для любых составных типов данных, таких как массивы или структуры.
Пона

10

Из этой страницы MSDN может показаться, что ваши единственные варианты - явное приведение ( var x = (byte)5) или прекращение использования var...


9
Это не только о var. Например,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
Джон Гитцен

@JohnGietzen, точно! В моем случае это так Math.Max(myByte, (byte)1). И кстати, вы можете заменить свой пример на:, this.pixels[x, y] = (byte)(condition ? 0 : 1);что для меня выглядит немного лучше, илиthis.pixels[x, y] = Convert.ToByte(!condition);
Шимми Вейцхандлер

Как насчет использования в атрибутах? например, xunit: [InlineData(1)]- [InlineData(1b)]выглядел бы намного лучше, чем [InlineData((byte)1)](использование только 1могло бы вызвать исключение, если параметр имеет значение nullable byte, и вы дали ему int)
Matthias Burger

3

Согласно MSDN вы можете объявить байт, используя десятичный, шестнадцатеричный или двоичный литерал.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
Да, но byte x; x = predicate ? 0x05 : 0x00;это ошибка, потому что результатом троичного оператора является int.
Фотон

1
@ThePhoton Ваше право! Единственное, что я могу сказать по этому поводу: WAT! destroyallsoftware.com/talks/wat
Адриан Томан

3
Это не отвечает на вопрос. Вопрос не в том, как я могу инициализировать байт, а в том, как я могу явно сказать «это байт». с var x = 5, х является целым, с var x = 5d, х является двойным. При использовании числа в качестве параметра в атрибуте это становится важным: конструктор с double мог бы делать что-то еще, кроме конструктора с int. (Возможно, не должно, но могло бы). Своим ответом вы показываете только разные возможности для инициализации x.
Матиас Бургер

@ThePhoton VB.net, давайте сделаем это. Dim x As Byte x = If (предикат, & H05, & H00)
Brain2000
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.