V6088. Result of this expression will be implicitly cast to 'Type'. Check if program logic handles it correctly.
Данное правило находит тернарные операторы, в которых происходит неявное приведение численных типов. Это может нарушить логику работы программы из-за неожиданной смены типа объекта.
Рассмотрим пример подобной ошибки:
public void writeObject(Serializer serializer, Object o)
{
....
else if (o instanceof Integer)
{
serializer.writeInt((Integer) o);
}
else if (o instanceof Double)
{
serializer.writeDouble((Double) o);
}
....
}
public void serialize(Serializer serializer)
{
Object data = condition ? 5 : 0.5; // <=
writeObject(serializer, data);
}
В данном случае фактическим аргументом метода 'writeObject' всегда будет являться число типа 'double': 5.0 или 0.5. Из-за этого внутри 'writeObject' будет выполнена не та ветка конструкции if-else-if, которая подразумевалась программистом. Исправление этой ошибки заключается в замене тернарного оператора на блок if-else:
public void serialize(Serializer serializer)
{
if (condition)
{
writeObject(serializer, 5);
}
else
{
writeObject(serializer, 0.5);
}
// or
Object data;
if (condition)
{
data = 5;
}
else
{
data = 0.5;
}
writeObject(serializer, data);
}
Особенность этой ошибки состоит в том, что взаимозаменяемые условный и тернарный операторы в реальности могут иметь различное поведение.