为什么这不起作用?我不能正确理解代表协方差吗?
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) {} }
解决方法
正确 – 你没有正确理解协方差 – 但是如果你有相同的类型但是返回值,你的代码会工作,如下所示:
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) {} }
这现在表现出逆差.
我的经验法则是问自己,“考虑到代表,我能用它做什么?如果我可以传入一个会破坏方法的参数,那么转换应该会失败.如果方法可以返回一些会破坏它的东西调用者,转换应该失败.“
_delegate(new object());
那时,可怜的MyMethod有一个参数,它的类型是SomeObject,但实际上是object类型.这将是一件非常糟糕的事情,因此编译器会阻止它发生.
这一切都更有意义吗?
原文地址:https://www.jb51.cc/csharp/244853.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。