2016-05-30 1 views
3

В C# можно присвоить номер (до 255) непосредственно к переменной типа байта:Зачем мне нужен дополнительный приём при использовании условного оператора?

byte red = 255; 

Однако если сделать это в более сложном заявлении с условным оператором:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : 255; 

Я получаю сообщение об ошибке: «CS0266 Невозможно неявно преобразовать тип« int »в« byte ». Явное преобразование существует (вам не хватает приведения?)».

мне нужно явно сделать бросок к байту за 255:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : (byte)255; 

Зачем нужен этот бросок?

+0

, потому как, если еще должен возвращать тот же тип экземпляра –

+0

Там не является неявным отбрасыванием из int в байт, но есть явный. Он называется «явным» по какой-либо причине - вам нужно применить его, ну, явно :) – Evk

ответ

3

Числовые литералы в C#: int, а не byte. Попробуйте 0xff.

Существует no implicit conversion from int to byte, и самое первое утверждение byte red = 255; - это особый случай.

A constant expression of type int can be converted to sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant expression is within the range of the destination type.

Это не объясняет, почему оно не преобразует константу 255 во второе выражение, не так ли?

Не нужно преобразовывать 255 во второе выражение, потому что there is an implicit conversion from byte to int. Таким образом, byte.Parse(redNode.Value) преобразуется в int. И поэтому (redNode != null) ? byte.Parse(redNode.Value) : 255; имеет тип int - и поскольку это не постоянное выражение, нет никакого неявного преобразования в byte.

Вы считаете, что сообщение об ошибке просит вас сделать это:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : (byte)255; 

, но это на самом деле просит вас сделать это:

byte red = (byte)((redNode != null) ? byte.Parse(redNode.Value) : 255); 
+0

Вопрос в том, почему он не работает в этом случае, но делает это при выполнении прямого назначения. – ChrisF

+1

Но почему это отличается от первого задания? –

+1

@ stefan.s 웃 немного расширил ответ. – Peter