C# противоречивость с аргументами метода - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь решить какую-то простую учебную задачу, которая включает в себя написание переводчика некоторого простого языка с 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 конструкцией?

...