#c#
#c#
Вопрос:
private byte[] ParsePatternString(string szPattern)
{
List<byte> list = new List<byte>();
foreach ( string text in szPattern.Split(new char[] { ' ' }) )
{
list.Add((text == "?") ? 0 : Convert.ToByte(text, 16));
}
return list.ToArray();
}
Ошибка возникает при list.Add((text == "?") ? 0 : Convert.ToByte(text, 16));
Мне интересно, как возникает ошибка, потому что, основываясь на других вопросах о подобной проблеме, я пробовал, и, похоже, это не сработало.
Комментарии:
1. Начиная с C # 9.0, условные выражения являются целевыми. Итак, в C # 9 ваш код будет работать. Не сидите на старой версии, переключитесь на новую.
Ответ №1:
0
является int
литералом. Как и в C, невозможно указать целочисленный литерал, меньший, чем int
. Тип условного оператора является общим типом двух значений, поэтому ваше выражение приводит к int
выражению и не может быть передано в byte
аргумент. Вам необходимо преобразовать выражение в byte
одно из следующих
list.Add(text == "?" ? (byte)0 : Convert.ToByte(text, 16));
list.Add((byte)(text == "?" ? 0 : Convert.ToByte(text, 16)));
Ответ №2:
byte.MinValue
В этом случае вы могли бы использовать:
private byte[] ParsePatternString(string szPattern)
{
List<byte> list = new List<byte>();
foreach ( string text in szPattern.Split(new char[] { ' ' }) )
{
list.Add(text == "?" ? byte.MinValue : Convert.ToByte(text, 16));
}
return list.ToArray();
}
Ответ №3:
На самом деле я никогда раньше не использовал CSharp, но я думаю, что проблема может заключаться в том, что он считывает 0 как int, а не логическое значение, и не преобразует его автоматически. Из того, что я читаю об этом, вам нужно добавить явное приведение, подобное этому:
list.Add((text == "?") ? (byte) 0 : Convert.ToByte(text, 16));