我对C#的反向/协方差是如何工作的感到困惑。我有以下伪代码
public static void Main()
{
Action<string> action = e => Console.WriteLine(e);
Execute(action);
}
private static void Execute(Action<object> action)
{
action("hello world");
}抛出
CS1502:最适合.有一些无效的参数
我也不太清楚为什么。另外,怎样才是正确的方法呢?
在实际场景中,我使用的是一个基本接口,而不是在具体实例中传递的对象。
谢谢!
发布于 2015-05-27 14:58:19
Action<in T>是相反的,这意味着您可以将“更大的”类型传递到方法中。因为string比object更小(更具体或更派生),所以会出现编译时错误。如果您逆转了您的示例,并创建了一个Action<object>而不是Action<string>,那么您的方法将编译:
public static void Main()
{
Action<object> action = e => Console.WriteLine(e);
Execute(action);
}
private static void Execute(Action<string> action)
{
action("hello world");
}发布于 2015-05-27 14:57:48
Actions和Funcs在其参数类型中是反变体--这意味着只有当U是T的子类型时,才能将Action<T>分配给Action<U>。在您的示例中,object是string的超级类型,因此赋值无效。
https://stackoverflow.com/questions/30486071
复制相似问题