Привет, неизвестный путник!

Добро пожаловать в документацию по языку C#.NStar! Здесь вы найдете информацию о его преобразованиях типов, отличающихся от оригинального C# от Microsoft.

Общие сведения
В C#.NStar статическая типизация (возможно, в будущем будут редкие исключения). Что касается "сильной" или "слабой" типизации, то, согласно этой статье, если принять последовательно слабую по всем четырем пунктам типизацию за 0%, а последовательно сильную по всем пунктам (как в Haskell) за 100%, то сила типизации C#.NStar - примерно 72.5%. По отдельным пунктам типизация в C#.NStar очень статическая (90%), слегка явная (30%), значительно строгая (70%) и абсолютно безопасная по памяти (100% - принудительно небезопасный код, если он и будет, можно не считать). Прямые неявные преобразования см. на диаграмме ниже.

Диаграмма неявных преобразований типов
Изображение1

Статический критерий
В C#.NStar подавляющее большинство типов статические, отношения между ними вычисляются на этапе трансляции (транспайлинга). Скидку 10% делает лишь наличие (в будущем) типа dynamic, который можно придать ячейке памяти (переменной, свойству или возвращаемому функцией, оператором или экстентом значению) только явно.

Явный критерий
Самый "слабый" в нашем языке - всего около 25-30%. Большинство тривиальных преобразований (например, int в real) выполняются неявно, более того - даже преобразования int в list() int и в list(n) int или (в будущем) list() int в list() real также выполняются неявно. Но слишком экзотическое преобразование транспайлер, скорее всего, откажется выполнять - за это 20%, и еще 5-10 за отсутствие неявного преобразования числа в строку, как и в C#.NET (а сложение строки с числом, как и с любым другим типом - это вопрос перегрузки операторов, а не типизации).
Также в C#.NStar был упразднен универсальный оператор явного преобразования (T)x - для этого используются в каждом случае свои функции и операторы - IntToReal() для byte, short int, unsigned short int, int, unsigned int, long int, unsigned long int, long long и unsigned long long (последние два - в будущем) в real, Floor(), Ceil(), Round() и Truncate() для real в int, деление или остаток от деления для более "широкого" целочисленного в более "узкий" целочисленный, сложение со строкой нулевой длины для любого типа в string и прочее.

Строгий критерий
В C#.NStar можно обойти ошибки транспайлинга по части типизации только в значении, возвращаемом функцией - там они превратятся в предупреждения (некоторые, в основном связанные с преобразованием числа в число). В операторах, присваиваниях и вызовах (функций и конструкторов) одна ошибка типизации вызовет лавинообразное превращение в null. То же самое сделают не "числовые" ошибки даже при возврате из функции - функция, скорее всего, вернет null.

Критерий безопасности по памяти
C#.NStar, как и C#.NET, в плане безопасности, был спроектирован так, чтобы "дать разработчику пистолет [для выстрела себе в известное место], но оставить его на предохранителе". Поэтому если принудительно не "выключать" этот "предохранитель", то язык безопасен. К сожалению, "платить" за это приходится утечками памяти, поэтому рекомендуем избегать коллекций ссылочных типов и не злоупотреблять коллекциями из коллекций, а коллекции из коллекций из коллекций вообще должны использоваться в исключительных случаях.



Назад к индексу документации