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

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

概述我在下面遇到编译器错误.我不知道为什么我不能引用派生类并将其传递给一个接受基类引用的方法.请注意,方法foo()和bar()不一定具有相同的语义,因此它们应该具有不同的名称,这些方法不是问题. public class X { public int _x; } public class Y : X { public int _y; } public class A { publi 我在下面遇到编译器错误.我不知道为什么我不能引用派生类并将其传递给一个接受基类引用的方法.请注意,方法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?

总结

以上是内存溢出为你收集整理的c# – 为什么不引用需要引用基类的方法的派生类工作?全部内容,希望文章能够帮你解决c# – 为什么不引用需要引用基类的方法的派生类工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1260318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存