带方法参数的C#逆变

带方法参数的C#逆变,c#,action,contravariance,C#,Action,Contravariance,我试图解决一些简单的学习任务,包括用4种方法编写一个简单语言的解释器:Set、Sum、Print、Remove;前两个方法有两个参数-变量名和int值设置为变量或求和为其当前值,后两个方法只有一个参数-变量名 我正在编写的方法采用字符串,例如“seta3”或“printaa”,应该作为该字符串的解释器(执行适当的操作)。 最明显的方法是使用switch结构(按第一个单词切换),但我读到使用Dictionary而不是switch,所以我定义了 Dictionary<string, Actio

我试图解决一些简单的学习任务,包括用4种方法编写一个简单语言的解释器:Set、Sum、Print、Remove;前两个方法有两个参数-变量名和int值设置为变量或求和为其当前值,后两个方法只有一个参数-变量名

我正在编写的方法采用字符串,例如“seta3”或“printaa”,应该作为该字符串的解释器(执行适当的操作)。 最明显的方法是使用
switch
结构(按第一个单词切换),但我读到使用
Dictionary
而不是
switch
,所以我定义了

Dictionary<string, Action<ActionArg>> methods
,并定义了4种方法,例如

void Set(ActionArgValVar) { ... }
但是当我试图编写
methods=newdictionary{{“set”,set},…}
时,出现了一个错误,因为
Action
由于
Action
的相反性而无法分配给
Action


有没有办法用
字典来解决这个问题,或者像这样的任务最好通过简单的
开关
构造来解决?

“但是我读到用字典而不是开关总是更好的”--我想这有点离谱了你有没有想过做集合、求和、打印,移除泛型方法本身并使用泛型约束来限制解释器的类型?请也分享这些方法的示例?
private static void Set(T arg),其中T:ActionArg
Pavel Anikhouski有效,感谢您的建议!(现在字典分配正确)canton7对不起,我的英语不是很好,你的意思是这项简单的任务太复杂了吗?Pavel Anikhouski,但我现在还有一个问题,在现在的每个方法中,我都应该使用cast,例如,
var argValVar=(ActionArgVarVal)arg
,或者有更优雅的方法?Pavel Anikhouski
void Set(T arg)其中T:ActionArg{var argValVar=(ActionArgVarVal)arg;//使用argValVar}
methods=newdictionary{{“set”,set}或者你的意思是别的,对不起?canton7似乎已被理解——关于字典和开关的短语太常见了
void Set(ActionArgValVar) { ... }