C# При решении задания, компилятор выдает ошибку компиляции: error CS0019: помогите разобраться
я только начал изучение C# При решении учебного задания, код не компилируется, выдает ошибку: VectorTask.cs(43,12): error CS0019: Operator '<' cannot be applied to operands of type 'bool' and 'double' Не понимаю почему символ < не может быть использован в условие IF Сам код:
public static bool IsVectorInSegment(Vector Vector,Vector End,Vector Begin)
{
double c= ((Vector.X- Begin.X)/(End.X-Begin.X));
double d= ((Vector.Y-Begin.Y)/(End.Y-Begin.Y));
if ((( End.X< Vector.X <Begin.X)||( Begin.X< Vector.X < End.X))&&(c==d))
return true;
else
return false;
}
Ответы (1 шт):
Эта ошибка означает, что у Вас несовместимые типа в сравнении.
То есть, около какого-то знака слева и справа стоят bool и double.
В Вашем, конкретном случае, в этой конструкции: (End.X< Vector.X <Begin.X), компилятор сначала сравнивает End.X< Vector.X, пускай будет 5.4 < 7.4, и получает true, затем берёт это значение и сравнивает с Begin.X то есть true < 12.2, вот он и ругается, мол не могу сравнить фиолетовый цвет с креслом, а вы спрашиваете у него, что из них больше?
Решение Вашей проблемы заключается в понимании типов переменных, конструкций языка, в общем почитайте литературу, пройдите онлайн уроки, чтобы изучить азы.
Также, есть 2 решения:
не очень хорошее: Вместо этой строки
if ((( End.X< Vector.X <Begin.X)||( Begin.X< Vector.X < End.X))&&(c==d))Вставить эту:
if (((( End.X< Vector.X) && (Vector.X <Begin.X))||(( Begin.X< Vector.X ) && (Vector.X < End.X)))&&(c==d))Лучше:
Во-первых, можно удалить лишние скобки, студия их выделяет слабым серым, тогда их можно стереть без угрозы логике.
Также, называйте локальные переменные с маленькой буквы, меньше ошибок, понятнее, что вы обращаетесь к объекту, а не к статическому классу:То есть, преобразуем Ваш код вот так:
public static bool IsVectorInSegment(Vector vector, Vector end, Vector begin) { double c = (vector.X - begin.X) / (end.X - begin.X); double d = (vector.Y - begin.Y) / (end.Y - begin.Y); if (((end.X < vector.X < begin.X) || (begin.X < vector.X < end.X)) && (c == d)) return true; else return false; }Во-вторых, эту проверку
c == dможно вынести вверх, чтобы проверки стали проще и понятнее, ведь если она не выполнится, то мы не получим true, никогда, то есть убрали ещё пару скобок, сбивающих с толку:public static bool IsVectorInSegment(Vector vector, Vector end, Vector begin) { double c = (vector.X - begin.X) / (end.X - begin.X); double d = (vector.Y - begin.Y) / (end.Y - begin.Y); if (c != d) return false; if ((end.X < vector.X < begin.X) || (begin.X < vector.X < end.X)) return true; else return false; }Далее, исправляем, Вашу, досадную ошибку:
public static bool IsVectorInSegment(Vector vector, Vector end, Vector begin) { double c = (vector.X - begin.X) / (end.X - begin.X); double d = (vector.Y - begin.Y) / (end.Y - begin.Y); if (c != d) return false; if (((end.X < vector.X) && (vector.X < begin.X)) || ((begin.X < vector.X) && (vector.X < end.X))) return true; else return false; }Далее проведем последнее преобразование, дам другой пример (для понимания), попроще:
if (b < c) return true; else return false;Компилятор сравнивает b и c, получая, например true, дальше проверяет, true == true?, значит надо вернуть true, можно же сразу, без проверки возвращать полученное значение сравнения, то есть:
return b < c;Ну, и вишенка на тортике, уберем лишний if, и в конечном итоге, получим:
public static bool IsVectorInSegment(Vector vector, Vector end, Vector begin) { double c = (vector.X - begin.X) / (end.X - begin.X); double d = (vector.Y - begin.Y) / (end.Y - begin.Y); if (c != d) return false; return ((end.X < vector.X) && (vector.X < begin.X)) || ((begin.X < vector.X) && (vector.X < end.X)); }