Буквальный суффикс для байта в .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.