CS1503: Аргумент 1: не удается преобразовать из ‘int’ в ‘byte’ C#

#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));