|  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;
}
				__________________ С уважением, Александр. | 
|  | 
|  | 
| 
 |