带方法参数的C#逆变
我试图解决一些简单的学习任务,包括用4种方法编写一个简单语言的解释器:Set、Sum、Print、Remove;前两个方法有两个参数-变量名和int值设置为变量或求和为其当前值,后两个方法只有一个参数-变量名 我正在编写的方法采用字符串,例如“seta3”或“printaa”,应该作为该字符串的解释器(执行适当的操作)。 最明显的方法是使用带方法参数的C#逆变,c#,action,contravariance,C#,Action,Contravariance,我试图解决一些简单的学习任务,包括用4种方法编写一个简单语言的解释器:Set、Sum、Print、Remove;前两个方法有两个参数-变量名和int值设置为变量或求和为其当前值,后两个方法只有一个参数-变量名 我正在编写的方法采用字符串,例如“seta3”或“printaa”,应该作为该字符串的解释器(执行适当的操作)。 最明显的方法是使用switch结构(按第一个单词切换),但我读到使用Dictionary而不是switch,所以我定义了 Dictionary<string, Actio
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 Anikhouskivoid Set(T arg)其中T:ActionArg{var argValVar=(ActionArgVarVal)arg;//使用argValVar}
methods=newdictionary{{“set”,set}代码>或者你的意思是别的,对不起?canton7似乎已被理解——关于字典和开关的短语太常见了
void Set(ActionArgValVar) { ... }