Чтобы ответить на ваш другой вопрос:
Может ли это быть достигнуто и в статически типизированных языках, таких как C #?
Является ли это языком поддерживает?Нет. Может ли быть достигнуто ?Вид.
C # - как C ++, Java и все такое - имеет выражения и операторы.Операторы, такие как if-then и switch-case, не возвращают значений и поэтому не могут использоваться в качестве выражений.Кроме того, в качестве небольшого отступления в вашем примере myValue
присваивается либо строке, либо целому числу, чего не может сделать C #, поскольку он строго типизирован.Вам нужно будет либо использовать object myValue
, а затем принять расходы на кастинг и бокс, использовать var myValue
(который все еще статический тип, только вывод) или какой-то другой причудливый ум.
В любом случае, так что еслиif-then
это утверждение, как вы это делаете в C #?Вы должны были бы создать метод для достижения цели если-то-еще.Вы можете использовать статический метод как расширение для bools, чтобы смоделировать способ Smalltalk:
public static T IfTrue (это значение bool, Action doThen, Action doElse) {if (value) return doThen ();иначе return doElse ();}
Чтобы использовать это, вы должны сделать что-то вроде
var myVal = (6 < 7).IfTrue(() => return "Less than", () => return "Greater than");
- Отказ от ответственности: я не проверял ничего из этого, поэтому он может не совсем работать из-за опечаток, но я думаю,принцип верен.
Новая функция IfTrue () проверяет логическое значение, к которому она присоединена, и выполняет один из двух делегированных ей делегатов.Они должны иметь одинаковый тип возвращаемого значения, и ни один из них не принимает аргументы (используйте замыкания, поэтому это не имеет значения).
Теперь, вы должны это сделать?Нет, почти наверняка нет.Это не правильный C # способ делать вещи, так что это сбивает с толку, и это гораздо менее эффективно, чем использование if-then.Вы торгуете чем-то вроде 1 IL-инструкции для сложного беспорядка классов и вызовов методов, которые .NET создаст за кулисами для поддержки этого.