Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 逆变和方法签名?_C#_.net_Covariance_Contravariance - Fatal编程技术网

C# 逆变和方法签名?

C# 逆变和方法签名?,c#,.net,covariance,contravariance,C#,.net,Covariance,Contravariance,看看这个代码 delegate void StringAction (string s); class Test { static void Main() { StringAction sa = new StringAction (ActOnObject); sa ("hello"); } static void ActOnObject (object o) { Console.WriteLine (o); // hello } } 此代码是否因矛盾而起作用?(Mor

看看这个代码

delegate void StringAction (string s);
class Test
{
static void Main()
{
    StringAction sa = new StringAction (ActOnObject);
    sa ("hello");
}
static void ActOnObject (object o)
{

   Console.WriteLine (o); // hello
 }
}

此代码是否因矛盾而起作用?(MoreDeriverdRef此代码之所以有效,是因为,正如Eric Lippert在中所说:

方法组到委托的转换在其 参数类型

上述仅适用于参考类型,但
string
object
都是参考类型,因此满足要求


这种差异从C#2.0开始就得到了支持,您不需要版本4中引入的额外支持来依赖它。

是的,这是由于差异造成的

这意味着您不仅可以将具有 匹配签名,还包括返回更多派生类型的方法 (协方差)或接受派生类型较少的参数 (相反)委托类型指定的值


从技术上来说,它之所以有效是因为第二个原因,但这仍然是一种逆变形式。这更像是第二个原因。因此,逆变与此无关…?如果此代码与2005(fw2)一起运行,它还会工作吗?(我不必测试)是的,它将从C#2.0开始工作。尽管这仍然是相反的,只是它不需要新的in关键字。我想你可以说这使它隐式而不是显式。哈哈,你是曲折的:-)C#2不支持cov。那你为什么还要写这篇文章呢?谢谢;-)嗯,您可以将
动作
隐式转换为
动作
这一事实是一种逆变形式。C#语言在版本4之前支持几种协方差/逆变(尽管数组上的协方差可能已被破坏)。您的第二点与逆变有关。@Jodrell为什么?您可以在接受animal的方法上执行dowork(myHorse)……我不是说委托……只是普通的方法,但这是因为方法调用是反变的,我们已经习惯了。它使多态性工作。