Текущее поведение на самом деле правильно, и заражение не является ошибкой.Позвольте мне объяснить поведение.
Когда вы читаете ввод как any choice = io:readln("Enter choice 1 - 5: ");
, переменная choice
имеет тип any
и будет содержать значение string
.Однако способ работы any
до typeX
(в данном случае int
) заключается в том, что он проверит, имеет ли фактическое значение в переменной любого типа значение typeX
(int), и если да, товыполните преобразование.
В этом случае фактическое значение внутри произвольной переменной choice
равно string
.Теперь, если мы попытаемся преобразовать это в int
, оно потерпит неудачу, потому что оно не содержит целого числа внутри.Таким образом, правильный подход - сначала получить строковое значение внутри переменной любого типа, а затем преобразовать строку в int на втором шаге.См. Пример ниже:
import ballerina/io;
function main(string... args) {
any choice = io:readln("Enter choice 1 - 5: ");
string choiceStr = <string>choice;
int choiceInt = check <int> choiceStr;
io:println(choiceInt);
}
Но, конечно, чтение cmd-ввода непосредственно в строку типа: string choice = io:readln("Enter choice 1 - 5: ");
- лучшее решение.