Я пытаюсь решить какую-то простую учебную задачу, которая включает в себя написание переводчика некоторого простого языка с 4 методами - Set, Sum, Print, Remove; первые 2 метода имеют 2 аргумента - имя переменной и значение int для установки переменной или суммы ее текущего значения, а последние 2 метода имеют только один аргумент - имя переменной
Метод, который я пишу, принимает строку, например «установить 3» или «напечатать a», и должен работать как интерпретатор этой строки (выполните соответствующие действия). Очевидный способ - использовать конструкцию switch
(переключение по первому слову), но я читал, что всегда лучше использовать Dictionary
вместо switch
, поэтому я определил
Dictionary<string, Action<ActionArg>> methods
, где ActionArg
определен супертип с 2 унаследованными типами:
abstract class ActionArg {}
class ActionArgVal : ActionArg { public string Val {get; set; } }
class ActionArgValVar : ActionArgVal { public int Var {get; set; } }
, и определил 4 метода, например,
void Set(ActionArgValVar) { ... }
Но когда я пытаюсь написать methods = new Dictionary<string, Action<ActionArg>> { {"set", Set}, ... }
, возникает ошибка, поскольку Action<ActionArgValVar>
не может быть назначен на Action<ActionArg>
из-за контравариантности Action
.
Есть ли способ решить эту проблему с помощью Dictionary
или таких задач, как это лучше решить простой switch
конструкцией?