C# 无法转换类型';系统行动<;int>';至';系统行动<;对象>';

C# 无法转换类型';系统行动<;int>';至';系统行动<;对象>';,c#,.net,delegates,C#,.net,Delegates,我想知道我是如何做到这一点的 Action<int> test = (val) => Console.WriteLine("I am " + val); Action<object> test2 = (Action<object>) test; Action test=(val)=>Console.WriteLine(“我是”+val); 动作测试2=(动作)测试; 代码: 我之所以需要这样做,是因为我正在创建一个类,该类将需要支持许多(数千)个操

我想知道我是如何做到这一点的

Action<int>  test = (val) => Console.WriteLine("I am " + val);
Action<object> test2 = (Action<object>) test;
Action test=(val)=>Console.WriteLine(“我是”+val);
动作测试2=(动作)测试;
代码:


我之所以需要这样做,是因为我正在创建一个类,该类将需要支持许多(数千)个操作委托参数类型

Action<object> test2 = (object o) => test((int)o);
Action test2=(对象o)=>test((int)o);

但我认为不需要太多解释,这是一件非常不安全的事情。因此,与其破坏类型安全性,不如想出一个更好的设计来尊重类型安全性。

如果调用
test2.Invoke(new object())
,您希望发生什么?您是否希望出现
无效的CastException
?代理通常是类型安全的。如果您提供更多的上下文,我们可能会为您提供更多帮助-目前这是一个XY问题。您是否在C#中查找方差和协方差?例如,这篇文章可能会有所帮助,尽管不是专门针对
操作
:请记住(忽略有限的协方差和逆变支持)-仅仅因为两种类型
A
B
具有特定的继承关系,这并不意味着泛型类型在这些类型上关闭(
g
g
)表现出相同的继承关系。一般来说(同样,忽略有限的方差支持),它们之间没有继承关系。不太清楚您想要实现什么。看起来你想做函数咖喱<代码>动作测试=(val)=>Console.WriteLine(“我是”+Convert.ToInt32(val));动作测试2=(obj)=>测试(obj);试验2(1)