to!T
обрабатывает гораздо более широкий диапазон преобразований, чем приведение.
Например, int i = 5; writeln(cast(string)i);
является ошибкой - нет действительного преобразования типа int в строку.Но int i = 5; writeln(i.to!string);
работает и печатает 5
.
Как правило, приведение типов - это просто переосмысление одних и тех же байтов с другим типом, с некоторыми исключениями: приведение между целочисленным типом и типом с плавающей запятой (int → float производитэквивалент; float → int truncates), приведение между типами классов (использует информацию о типе среды выполнения, чтобы убедиться, что приведение является действительным; в противном случае возвращает null), приведение из класса к интерфейсу (который дает вам указатель на поддельный объект, которыйнаправляет функции соответствующим образом - это странно).
to
пытается сделать намного больше логических преобразований, чаще всего в и из строк.