Подскажите пожалуйста. Работает ли в C# битовый оператор | для типов, как в тайпскрипте.
То есть могу ли я каким-либо способом указать, что в метод может прийти два разных типа, например??
public static void Main(string[] | number[] args)
{
//Your code goes here
Console.WriteLine("Hello, world!");
}
В TypeScript такое возможно, потому что JavaScript без разницы, что передадут. В C# такое не получится. Не получится, чтобы это была статическая типизация и при этом такие финты ушами. Можно передавать интерфейс и разные его реализации.
Нет, пока нельзя. В будущем возможно появится. В случае с Main вам нужно принимать массив строк и парсить их в нужный тип. В других случаях можно использовать object[] или ArrayList и приводить каждый элемент к нужному типу
Илья, потому что это нарушает SOLID, это завязка на реализации, это всегда сплитит логику на то количество типов, которое указано в Union кроме одного случая: T | T[], после которого из T создаётся одноэлементный T[]
Короче говоря, везде, где ты написал x: T | U — там ты всегда напишешь if (x instanceof T) {} и if (x instanceof U) {}
Имхо, единственная причина, почему в TypeScript есть Union Types — это существующая огромная база говнокода в сообществе, которую сложно переделать нормально, ровно как и переделать мышление всех программистов на JavaScript.
Roman Kitaev, я думаю что функциональные техники не вполне корректно оценивать с точки зрения SOLID, потому что эти принципы были придуманы для ООП. И в функциональных языках типа Haskell или F# discriminated union + pattern matching дают более логичную (с моей точки зрения) альтернативу полиморфизму в целом. Правда в typescript пока адекватного pattern matching пока так и не появилось.
Roman Kitaev, да и если посмотреть на то как развивается typescript, на его changelog, то можно заметить очень сильное заимствование техник функционального программирования.
В будущем, скорее всего, появятся Discriminated unions, но сейчас такого нет.
Как альтернативы:
1. Перегрузка методов
2. Полиморфизм (в данном случае принимать object[] и в цикле делать switch(x) { case string s: ...; case object o: ...}
Levingstoun, частный случай полиморфизма, но я имел в виду, что мы вместо копирования методов с разными сишнатурами делаем 1 метод, который принимает базовый тип.
Ещё вариант - сделать женерик, но в обоих случаях на этапе компиляции метод будет принимать не только string и number, но и любые другие типы, которые наследуют базовый.