加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 代表协方差混淆难题!

发布时间:2020-12-15 08:47:05 所属栏目:百科 来源:网络整理
导读:为什么这不起作用?我不能正确理解代表协方差吗? public delegate void MyDelegate(object obj)public class MyClass{ public MyClass() { //Error: Expected method with 'void MyDelegate(object)' signature _delegate = MyMethod; } private MyDelegate
为什么这不起作用?我不能正确理解代表协方差吗?
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类型.这将是一件非常糟糕的事情,因此编译器会阻止它发生.

这一切都更有意义吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读