C# 为什么我不能采取行动<;Int32>;采取行动<;对象>;?

C# 为什么我不能采取行动<;Int32>;采取行动<;对象>;?,c#,casting,C#,Casting,我有几个地方有动作,动作,动作正在使用,但是当涉及到在类方法中将动作作为参数传递时,我不能将动作或动作转换为动作 为什么不能用简单类型转换来完成转换?这个演员可能吗?最后,如果可能的话,我将如何进行此转换。因为它会破坏类型安全性 当您声明操作时,您会说“这是一个需要一个Int32参数的委托” 如果可以将其直接转换为操作,则现在可以使用肯定不是Int32的内容调用该操作,例如DateTime。在这种情况下,C#可以防止你射中自己的脚。,因为它会破坏类型安全 当您声明操作时,您会说“这是一个需要一个

我有几个地方有
动作
动作
动作
正在使用,但是当涉及到在类方法中将动作作为参数传递时,我不能将
动作
动作
转换为
动作


为什么不能用简单类型转换来完成转换?这个演员可能吗?最后,如果可能的话,我将如何进行此转换。

因为它会破坏类型安全性

当您声明
操作
时,您会说“这是一个需要一个Int32参数的委托”


如果可以将其直接转换为
操作
,则现在可以使用肯定不是
Int32
的内容调用该操作,例如
DateTime
。在这种情况下,C#可以防止你射中自己的脚。

,因为它会破坏类型安全

当您声明
操作
时,您会说“这是一个需要一个Int32参数的委托”


如果可以将其直接转换为
操作
,则现在可以使用肯定不是
Int32
的内容调用该操作,例如
DateTime
。在这种情况下,C#阻止你射中自己的脚。

你不能通过协方差(或者是逆变?)进行直接投射,因为
动作基本上不是
动作
——后者可以传递任何对象,而前者只能传递
int

您可以通过包装您的操作来解决此问题,例如:

Action<int> aInt = ...;
Action<object> aObj = o => aInt((int)o);
操作aInt=。。。;
动作aObj=o=>aInt((int)o);
这再次向您展示了为什么强制转换可能不是一个好主意-如果您传递了
aObj
int
之外的任何内容,您将得到一个强制转换异常


相反,从理论上讲,您可以将
操作
强制转换为
操作
,因为如果您可以将任何对象传递给它,您当然可以将
int
传递给它。然而,在实践中,这只适用于引用类型,而不适用于值类型-因此您可以使用
string
,但不能使用
int
,,您不能通过协方差直接进行转换(或者是逆变?),因为
操作基本上不是
操作
,后者可以传递给任何对象,而前者只能传递一个
int

您可以通过包装您的操作来解决此问题,例如:

Action<int> aInt = ...;
Action<object> aObj = o => aInt((int)o);
操作aInt=。。。;
动作aObj=o=>aInt((int)o);
这再次向您展示了为什么强制转换可能不是一个好主意-如果您传递了
aObj
int
之外的任何内容,您将得到一个强制转换异常


相反,从理论上讲,您可以将
操作
强制转换为
操作
,因为如果您可以将任何对象传递给它,您当然可以将
int
传递给它。但是,实际上,这只适用于引用类型,而不适用于值类型-因此可以使用
string
,但不能使用
int

操作,因为其输入是Int32。这意味着您使用的操作可以假设输入为int。例如,您可以使用另一个int
n=>Console.WriteLine(n+4)
进行计算。所以这个动作,或者说功能,非常适合这个盒子。如果更改框,则先前所做的假设仍然有效。您基本上与“常规”铸造场景有反向关系,或反向关系,例如:
objecta=(object)2


只要记住,任何适合操作框的东西都不必对其输入的行为进行任何假设。函数
n=>Console.WriteLine(n)
非常适合内部,因为所有对象都可以打印。并非所有对象都可以像INT一样工作。

操作在其输入为Int32的限制下工作。这意味着您使用的操作可以假设输入为int。例如,您可以使用另一个int
n=>Console.WriteLine(n+4)
进行计算。所以这个动作,或者说功能,非常适合这个盒子。如果更改框,则先前所做的假设仍然有效。您基本上与“常规”铸造场景有反向关系,或反向关系,例如:
objecta=(object)2


只要记住,任何适合操作框的东西都不必对其输入的行为进行任何假设。函数
n=>Console.WriteLine(n)
非常适合内部,因为所有对象都可以打印。并不是所有的对象都可以像int一样工作。

这将是协方差,但
Action
在T中是逆变的。如果“可兑换箭头”指向同一方向,则是协方差。如果
string-->object
表示
X-->X
X
是协变的,因为箭头彼此对应。如果
string-->对象
意味着
X。。。就这样,
co
conta
现在对我来说是有意义的。谢谢你,埃里克!这可能是协方差,但动作在T中是逆变的。如果“可兑换箭头”指向同一方向,这就是协方差。如果
string-->object
表示
X-->X
X
是协变的,因为箭头彼此对应。如果
string-->对象
意味着
X。。。就这样,
co
conta
现在对我来说是有意义的。谢谢你,埃里克!