Ada*_*oll 8 c# delegates covariance
为什么这不起作用?我是否正确理解代表协方差?
public delegate void MyDelegate(object obj)
public class MyClass
{
public MyClass()
{
//Error: Expected method with 'void MyDelegate(object)' signature
_delegate = MyMethod;
}
private MyDelegate _delegate;
public void MyMethod(SomeObject obj)
{}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 12
正确 - 你没有正确理解协方差 - 但是如果你有相同的类型但是返回值,你的代码会工作,如下所示:
public delegate object MyDelegate()
public class MyClass
{
public MyClass()
{
_delegate = MyMethod;
}
private MyDelegate _delegate;
public SomeObject MyMethod() { return null; }
}
Run Code Online (Sandbox Code Playgroud)
这将证明协方差.或者,您可以将其保留为参数,但切换类型:
public delegate void MyDelegate(SomeObject obj)
public class MyClass
{
public MyClass()
{
_delegate = MyMethod;
}
private MyDelegate _delegate;
public void MyMethod(object obj) {}
}
Run Code Online (Sandbox Code Playgroud)
这现在证明了逆转.
我的经验法则是问自己,"鉴于代表,我能用它做什么?如果我可以传入一个会破坏方法的参数,那么转换应该失败.如果方法可以返回一些会破坏它的东西调用者,转换应该失败."
在您的代码中,您可以调用:
_delegate(new object());
Run Code Online (Sandbox Code Playgroud)
在这一点上,穷人MyMethod有这一个参数的意思是类型的SomeObject,但实际上类型object.这将是一件非常糟糕的事情,因此编译器会阻止它发生.
这一切都更有意义吗?