Как может следовать из вывода команд explain и help, Toolshed — это строго типизированный язык. Система типов, по большей части, соответствует C#, хотя toolshed добавляет некоторые дополнительные правила типов для удобства как пользователей, так и разработчиков. То есть вывод команд — это реальные C#-типы, такие как int, EntityUid или какой-нибудь IEnumerable<T>, а не просто строки. Все команды имеют сигнатуру типа, и эта сигнатура может динамически изменяться в зависимости от типа переданного значения.
Например, тип, переданный в команду сложения +, определяет тип вывода и способ парсинга аргумента.
Например, i 1 + 2 и f 1 + 2.5 — валидные команды, но i 1 + 1.5 не сможет распарсить “1.5” как int-аргумент.
Аргументы типа
Некоторые аргументы команд также принимают аргументы типа. Эти аргументы обычно определяют тип вывода или способ парсинга других аргументов. Аргументы типа всегда указываются перед любыми другими аргументами, но в остальном выглядят как обычные аргументы. В сигнатурах команд help и explain они отображаются как часть имени команды, используя синтаксис C# generics, т.е. <T>, <T1, T2>.
Например, команда comp:get<T> имеет сигнатуру IEnumerable<EntityUid> -> IEnumerable<T>, где T — любой указанный пользователем компонент. Фактический тип компонента указывается через аргумент типа:
Для пользователей
Все значения — это список длиной 1 (T -> IEnumerable<T>)
Toolshed автоматически преобразует одиночное значение в список, содержащий только это значение, если необходимо. Это позволяет применять команды, работающие только с перечислениями, к одиночным значениям.
Любая коллекция T — это IEnumerable<T>
Технически это не специфика toolshed, но полезно знать, что можно использовать List<T>, HashSet<T>, Dictionary<K,V> и т.д. как вход для любой команды, принимающей перечисление.
IEnumerable<T> упаковывается в List<T> при присваивании
При присваивании перечисления переменной Toolshed автоматически преобразует его в список для полного вычисления и возможности повторного использования.
В C# использование IEnumerable<T> более одного раза запрещено, отсюда и это преобразование.
Для разработчиков
Ограничения ковариантности и контравариантности
Toolshed отказывается выполнять сложные проверки присваиваемости для типов с более чем одним ковариантным или контравариантным аргументом, чтобы избежать комбинаторного взрыва при поиске всех возможных типов для использования.
IAsType<T> и неявное приведение
Toolshed для любого типа, реализующего IAsType<T>, будет считать T валидным неявным приведением для этого типа.
Например, если Foo : IAsType<Bar>, Toolshed использует реализацию IAsType для получения Bar из Foo, если это позволит успешно проверить типы при выполнении команды. Последнее изменение 21 июня 2026 г.