Types
Toolshed’s type system is, for the most part that of C#’s. Toolshed adds some additional type rules for the convenience of both users and developers.
For users
All values are a list of length 1 (T -> IEnumerable<T>
)
Toolshed will automatically cast a lone value into a list containing only that value, if necessary. This lets you apply enumerable only commands to single values if necessary.
Any collection of T is an IEnumerable<T>
This isn’t technically toolshed specific, but it’s useful to know that one can use a List<T>
, HashSet<T>
, Dictionary<K,V>
, etc, as the input to any command taking an enumerable.
IEnumerable<T>
is boxed into List<T>
on assignment.
When assigning an enumerable to a variable, Toolshed will automatically coerce it into a list to fully evaluate it and allow you to reuse it.
Within C#, using an IEnumerable<T>
more than once is disallowed, hence this coersion.
For developers
Co-variance and Contra-variance limitations.
Toolshed will refuse to do complex assignability checks for types with more than one co-variant or contra-variant argument, as to avoid combinatorial explosion from searching all possible types to use.
IAsType<T>
and implicit casting.
Toolshed will, for any type implementing IAsType<T>
, consider T to be a valid implicit cast for that type.
For example, if Foo : IAsType<Bar>
, Toolshed will use the IAsType implementation to obtain Bar from Foo if it’d allow it to successfully typecheck a command run.