23.06.2011, 10:38 | #1 |
Участник
|
Несоответствие типов: ожидалось real, а получено int
AX2009. Странное поведение коллекций Set и Array (для коллекции Map не воспроизводиться).
Почему в некоторых случаях не срабатывает неявное приведение типов? X++: Set set = new Set(Types::Real); Array array = new Array(Types::Real); Map map = new Map(Types::Real, Types::Real); ; // set.add(0); // Несоответствие типов: ожидалось real, а получено int. // array.value(1, 0); // Несоответствие типов: ожидалось real, а получено int. map.insert(0, 0); // ok |
|
23.06.2011, 11:10 | #2 |
Молодой, подающий надежды
|
Давно привык, там, где использую real и нет дробной части, ставлю после числа точку. Избавляет от подобных глюков.
X++: set.add(0.); // ok array.value(1, 0.); // ok map.insert(0., 0.); // ok |
|
23.06.2011, 11:25 | #3 |
Участник
|
Это всё понятно. Можно использовать соответствующие литералы, а в случае переменных можно перед использованием перегнать значение из целочисленной переменной в вещественную. Только ради чего всё это делать? Я не вижу в этом никакого смысла. По-моему, необходимость делать это является следствием бага. Или всё-таки это фича? Тогда в чём её смысл?
|
|
23.06.2011, 11:47 | #4 |
Участник
|
Это не бага, это следствие использования anytype в методах add и value. Компилятор не может сгенерить кастинг, поскольку нужный тип будет известен только при выполнении, и поэтому отдаёт параметр как есть. А классы Set и Array внутри strictly-typed, цитата из хелпа (метод add класса Set):
X++: The value must be of the same type as the type assigned to the set when it was created.
__________________
SY, AVA |
|
23.06.2011, 11:55 | #5 |
Участник
|
В третьей Аксапте наблюдается то же самое:
Цитата:
// set.add(0); // Несоответствие типов: ожидалось real, а получено int.
// array.value(1, 0); // Несоответствие типов: ожидалось real, а получено int. X++: static void TestTypesJob(Args _args) { Types type; ; type = typeof(0); info(enum2str(type));//Integer type = typeof(0.0); info(enum2str(type));//Real }
__________________
С уважением, Александр. |
|
23.06.2011, 11:58 | #6 |
Участник
|
А по какой причине тогда с коллекцией Map дела обстоят иначе?
|
|
23.06.2011, 12:02 | #7 |
Участник
|
Цитата:
А по какой причине тогда с коллекцией Map дела обстоят иначе?
__________________
С уважением, Александр. |
|
23.06.2011, 12:47 | #8 |
Участник
|
|
|
23.06.2011, 13:03 | #9 |
Участник
|
Пример функции инвертирования (взят из книги Еременко, Шашкова)
X++: Map invertMap(map _mapToInvert) { mapIterator it; map result = new map(_mapToInvert.valueType(), _mapToInvert. keyType()) ; if(_mapToInvert.keyset().elements() != _mapToInvert.valueSet().elements()) { return null; } it = new mapIterator(mapToInvert); while(it.more()) { result.insert(it.value(), it.key()); it.next(); } return result; }
__________________
С уважением, Александр. |
|
|
|