Устранение ошибки с операндами типа object и int - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь обработать список десятичных знаков, которые вводятся в блок C # Script в Grasshopper.объект x получает входной список десятичных дробей, а объект ref A должен затем вывести решение.В настоящее время, хотя я получаю эту ошибку:

1. Error (CS0019): Operator '-' cannot be applied to operands of type 'object' and 'int' (line 59)

private void RunScript(object x, ref object A)
  {
    int intNum = new int();
    intNum = Convert.ToInt32(x);
    A = x - intNum;
  }

Я не понимаю, почему это не работает, любое понимание было бы удивительно полезно.Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Если то, что вы хотите сделать, это взять список десятичных дробей и вычесть по одному из каждого, изменяя список, вы сделаете следующее:

void MutateList(List<decimal> values)
{
  for(int i = 0; i < values.Count; i += 1)
    values[i] -= 1m;
}

Если вы хотите взять список десятичных дробейи вернуть другой список, где новый список совпадает со старым списком, но каждый элемент на один меньше, то есть:

List<decimal> NewList(List<decimal> values)
{
  return values.Select(v => v - 1m).ToList();
}

Если по какой-то причине вы ограничены сценариямиСистема для подписи:

void RunScript(object input, ref object output)
{
}

Тогда вы делаете то же самое, что и раньше .Если вам нужно изменить список, вы сделаете следующее:

void MutateList(List<decimal> values)
{
  for(int i = 0; i < values.Count; i += 1)
    values[i] -= 1m;
}
void RunScript(object input, ref object output)
{
    MutateList((List<decimal>)input);
}

Вы сохраните себя в мире разумных типов в максимально возможной степени .

Аналогично, есливам нужно вернуть новый список:

List<decimal> NewList(List<decimal> values)
{
  return values.Select(v => v - 1m).ToList();
}
void RunScript(object input, ref object output)
{
    output = NewList((List<decimal>)input);
}

Сохраняйте как можно больше статически типизированного кода и пишите разумный, нормальный код C #. Используйте странный интерфейс только там, где требуется использовать странный интерфейс .Везде должен быть нормальный, статически типизированный код C #.

0 голосов
/ 23 февраля 2019

Вы должны привести к Int32 вашу переменную x.Вы не можете вычесть из объекта

    private void RunScript(object x, ref object A)
    {
        int intNum = new int();
        intNum = Convert.ToInt32(x);
        A = (int) x - intNum;
    }
...