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。例如,您可以使用另一个intn=>Console.WriteLine(n+4)
进行计算。所以这个动作,或者说功能,非常适合这个盒子。如果更改框,则先前所做的假设仍然有效。您基本上与“常规”铸造场景有反向关系,或反向关系,例如:objecta=(object)2代码>
只要记住,任何适合操作框的东西都不必对其输入的行为进行任何假设。函数n=>Console.WriteLine(n)
非常适合内部,因为所有对象都可以打印。并非所有对象都可以像INT一样工作。操作在其输入为Int32的限制下工作。这意味着您使用的操作可以假设输入为int。例如,您可以使用另一个intn=>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
现在对我来说是有意义的。谢谢你,埃里克!