Почему тернарный оператор C#, по - видимому, изменяет тип возвращаемых значений?
У меня есть следующее
if()
заявление:if( _hexColourString.Length >= 8 ) _bytes[ 3 ] = byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier ); else _bytes[ 3 ] = 0x00;
Если я попытаюсь выразить это с помощью тернарного оператора, то получу ошибку, говорящую о том, что я не могу неявно преобразовать
int
К byte
Следующее не компилируется:_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ? byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier ) : 0x00;
Поэтому я решил проверить, какая половина троичного задания дает проблему. Я вынул условную часть утверждения и записал два задания как отдельные утверждения, например::
_bytes[ 3 ] = byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier ); _bytes[ 3 ] = 0x00;
Оба они компилируются. Тернарный оператор, по-видимому, изменяет неявный тип одного из назначений (литерала
0x00
).Почему происходит простое назначение
_bytes[ 3 ] = 0x00;
компилировать нормально без приведения, но требует его, когда выражение является частью тернарного оператора?Что я уже пробовал:
В качестве последней проверки здравомыслия я хотел окончательно понять, какая сторона задания была причиной проблемы. Я подозревал, что буквальный шестнадцатеричный байт, и, похоже, я прав. Следующее бессмысленное утверждение компилируется:
_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ? byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier ) : byte.Parse( _hexColourString.Substring( start + 6, 2 ), NumberStyles.AllowHexSpecifier );
Но следующее столь же бессмысленное утверждение не компилируется:
_bytes[ 3 ] = ( _hexColourString.Length >= 8 ) ? 0x00 : 0x00;
CHill60
Потому что 0x00-это int, а не байт, возможно?
Patrick Skelton
Конечно, вы правы. Я думаю, что мой вопрос действительно должен был бы состоять в том, почему простое присваивание (_bytes[ 3 ] = 0x00;) компилируется нормально без приведения, но требует его, когда выражение является частью тернарного оператора?
CHill60
Обычно я бы сказал, что было неявное преобразование, но нет никакого неявного преобразования из int в byte. Компилятор должен обнаружить, что 0x00 как константа меньше байта и не вызовет переполнения - кто знал, что MS может быть настолько умной? :-)
Patrice T
И компилятор вам что-то говорит ?
Patrick Skelton
Извините, я не уверен, что понял вопрос. Когда я использую 0x00 в тернарном операторе, компилятор действительно говорит мне, что я не могу преобразовать int в байт, что является однозначной, краткой формулировкой проблемы. Я попытался прояснить свой вопрос.