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

c# – 为什么不引用需要引用基类的方法的派生类工作?

发布时间:2020-12-15 06:56:34 所属栏目:百科 来源:网络整理
导读:我在下面遇到编译器错误.我不知道为什么我不能引用派生类并将其传递给一个接受基类引用的方法.请注意,方法foo()和bar()不一定具有相同的语义,因此它们应该具有不同的名称,这些方法不是问题. public class X { public int _x; } public class Y : X { public
我在下面遇到编译器错误.我不知道为什么我不能引用派生类并将其传递给一个接受基类引用的方法.请注意,方法foo()和bar()不一定具有相同的语义,因此它们应该具有不同的名称,这些方法不是问题.
public class X { public int _x; }  
public class Y : X { public int _y; }  

public class A {  
  public void foo( ref X x ) {  
    x._x = 1;  
  }  
}  

public class B : A {  
  public void bar( ref Y y ) {  
    foo( ref y ); // generates compiler error
    foo( ref (X)y); // wont work either
    y._y = 2;  
  }  
}

我找到的唯一解决方案是:

public class B : A {  
  public void bar( ref Y y ) {  
    X x = y;
    foo( ref x ); // works
    y._y = 2;  
  }  
}

我知道“y”永远不会在bar()中初始化,但由于它声明为ref本身必须在方法之外进行初始化,因此无法解决问题.你能解决这个问题的任何照明都会有所帮助.我确信它只是我对C#缺乏的理解,这可以在C中使用强制转换.

解决方法

因为没有办法确保你不会用一个完全不同于你首先传递的类型的实例替换引用.

鉴于:

class Base
{}

class Hamster : Base
{}

class ADentist : Base
{}


void ohWait(ref Base obj)
{
    obj = new ADentist();
}

以这种方式调用时:

var foo = new Hamster();
ohWait(ref foo);

会破坏性的.
Eric Lippert解释说它比我更好:
Why do ref and out parameters not allow type variation?

(编辑:李大同)

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

    推荐文章
      热点阅读