.NETのバイトのリテラルサフィックス?


162

floatやdoubleのようにバイト変数を短い方法で宣言する方法はあるのでしょうか。私のような意味5f5d。確かに私はを書くことができbyte x = 5ますがvar、ローカル変数に使用する場合、それは少し重要ではありません。


20
ここのほとんどの人varは、唯一のユースケースであると想定しているようです。他にも有効な使用例があります。たとえば、byte value = condition ? (byte)5 : (byte)6
Hameer Abbasi 2014

@HameerAbbasiあなたの場合は私が行くだろうvar value = (byte)(condition ? 5 : 6);
Shimmy Weitzhandler 2017

少し厄介かもしれませんが、byte value = condition ? ub5 : ub6;を定義することでうまくいくでしょうbyte ub5 = 5, ub6 = 6;。hehe
イントレ

@HameerAbbasiなんでやらないのbyte value = condition ? 5 : 6;
NetMage

@NetMage質問が投稿された時点では機能しませんでした。
Hameer Abbasi

回答:


147

ByteMSDNリファレンスおよび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

21
0b1010_1011_1100_1101_1110_1111まだInt32です。
BanksySan

1
0bカバーされているC#7ドキュメントへのリンクを提供していただけませんか。
user3613932

29

したがって、昨年の秋にVBにバイナリリテラルを追加し、初期のテスターから同様のフィードバックを得ました。VBのバイトのサフィックスを追加することにしました。SB(符号付きバイト)とUB(符号なしバイト)で解決しました。BとSBだけではない理由は2つあります。

1つは、16進数で記述している場合(0xFFBの意味は?)、Bのサフィックスがあいまいであり、その解決策があったとしても、「B」以外の文字(「Y」が考慮され、F#がこれを使用する)であってもデフォルトが署名されているか、署名されていないかを思い出すことができます-.NETバイトはデフォルトで署名されていないため、BとSBを選択することは理にかなっていますが、他のすべてのサフィックスはデフォルトで署名されているため、Bを選択する他のタイプのサフィックスと一貫しています。 UB。最後に、明確なSBとUBを選びました。-アンソニー・D・グリーン、

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

どうやら、彼らはVB.NETでこの動きをしているようです(現在リリースされていない可能性があります)。彼らはそれをroslynでC#に実装する可能性があります。また、可能な構文を提案する機会もあります。


1
サフィックスはまだMSDNページにリストされていません(2015年7月20日更新)。
mbomb007 2017年

4
そして、まだVS 2017に実装されていないようだ
光子

2
上記のMSDNページ(2018年1月30日更新)のとおり:ブール、バイト、文字、日付、オブジェクト、SByte、Short、UInteger、ULong、またはUShortデータ型には識別子型文字がありません、または配列や構造体などの複合データ型の場合。
Pona

10

この MSDNページから、あなたの唯一のオプションは明示的にキャストする(var x = (byte)5)か、または使用を中止することvarです...


9
それだけではありませんvar。たとえば、this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen 2017

@JohnGietzen、まさに!私の場合はMath.Max(myByte, (byte)1)です。ところで、あなたの例を次のように置き換えることができます:this.pixels[x, y] = (byte)(condition ? 0 : 1);、これは私には少し良く見えます、またはthis.pixels[x, y] = Convert.ToByte(!condition);
Shimmy Weitzhandler

属性で使用するのはどうですか?例:xunit:[InlineData(1)]- [InlineData(1b)]よりも見栄えが良い[InlineData((byte)1)]1パラメーターがnull可能なバイトで、intを指定した場合にのみ例外がスローされる)
Matthias Burger

3

MSDNに従って、10進数、16進数、または2進数リテラルを使用してバイトを宣言できます。

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
はい。ただしbyte x; x = predicate ? 0x05 : 0x00;、3項演算子の結果はintであるため、エラーになります。
フォトン

1
@ThePhotonあなたの権利!私に言えることは、WAT!だけです。destroyallsoftware.com/talks/wat
Adrian Toman

3
これは質問の答えにはなりません。質問は、バイトを初期化する方法ではなく、「バイトだ」と明示的に言う方法です。with var x = 5、xはint、with var x = 5d、xはdoubleです。属性のパラメーターとして数値を使用する場合、これは重要になります。doubleを使用したコンストラクターは、intを使用したコンストラクター以外の何かを実行できます。(すべきではないかもしれませんが、可能です)。あなたの答えでは、それを初期化するさまざまな可能性のみを示しますx
Matthias Burger

@ThePhoton VB.netでそれを実現しましょう。Dim x As Byte x = If(述語、&H05、&H00)
Brain2000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.