正确-您没有正确理解协方差-但是:)如果您具有相同的类型但作为返回值,您的代码将起作用,如下所示:
public delegate object MyDelegate()
public class MyClass
{
public MyClass()
{
_delegate = MyMethod;
}
private MyDelegate _delegate;
public SomeObject MyMethod() { return null; }
}
这将证明协方差。或者,您可以将其保留为参数,但切换类型:
public delegate void MyDelegate(SomeObject obj)
public class MyClass
{
public MyClass()
{
_delegate = MyMethod;
}
private MyDelegate _delegate;
public void MyMethod(object obj) {}
}
这现在证明了逆变。
我的经验法则是问自己,“给定委托,我能用它做什么?如果我可以传入一个会破坏方法的参数,那么转换应该失败。如果方法可以返回一些会破坏caller,转换应该失败。”
在您的代码中,您可以调用:
_delegate(new object());
那时,poorMyMethod
有一个参数应该是type SomeObject
,但实际上是 type object
。这将是一件非常糟糕的事情,因此编译器会阻止它发生。
这一切更有意义吗?