Восклицательный знак здесь не является оператором, это всего лишь маркерная часть явного синтаксиса создания экземпляра шаблона (подробно описано здесь ).
std.conv.to
(docs ) - это шаблон функции для преобразования между произвольными типами.Он полностью реализован в библиотеке и не имеет специальной поддержки в языке.Он имеет более широкую область действия по сравнению с оператором приведения.
Шаблон to
принимает два параметра типа;тип "to" и тип "from" в указанном порядке.В вашем примере шаблон явно создается с аргументом одного типа ushort
для параметра "to", а аргумент второго типа string
(при условии, что args
происходит от первого параметра до main
), автоматически выводитсяиз аргумента обычной функции, переданного функции (args[1]
) в качестве параметра from.
Результирующая функция принимает строковый параметр и возвращает разбор ushort из этой строки или выдает исключение, если она не удалась,Оператор приведения не будет пытаться выполнить такое высокоуровневое преобразование.
Обратите внимание, что если имеется более одного явного параметра шаблона или этот параметр содержит более одного токена (ushort
- это одно ключевое словоtoken), вы должны заключить список параметров шаблона в круглые скобки:
ushort result;
result = to!(typeof(result))(args[1]);
В этом примере typeof
, (
, result
и )
- это четыре отдельных токена, поэтому круглые скобкитребуется.
Чтобы ответить на ваш последний вопрос, токен !
также используется для унарного оператора not, не связанного с экземплярами шаблона:
bool yes = true;
bool no = !yes; // 'no' is false